Как сделать так, чтобы Python запоминал настройки? - PullRequest
1 голос
/ 27 июня 2010

Я написал прекрасный пример кода на Python ниже. Теперь, как мне сделать так, чтобы при выходе и перезапуске программа запоминала последнюю позицию шкалы?

import Tkinter

root = Tkinter.Tk()

root.sclX = Tkinter.Scale(root, from_=0, to=1500, orient='horizontal', resolution=1)
root.sclX.pack(ipadx=75)

root.resizable(False,False)
root.title('Scale')
root.mainloop()

Edit:

Я попробовал следующий код

import Tkinter
import cPickle


root = Tkinter.Tk()

root.sclX = Tkinter.Scale(root, from_=0, to=1500, orient='horizontal', resolution=1)
root.sclX.pack(ipadx=75)



root.resizable(False,False)
root.title('Scale')


with open('myconfig.pk', 'wb') as f:
    cPickle.dump(f, root.config(), -1)
    cPickle.dump(f, root.sclX.config(), -1)
root.mainloop()

Но получите следующую ошибку

Traceback (most recent call last):
  File "<string>", line 244, in run_nodebug
  File "C:\Python26\pickleexample.py", line 17, in <module>
    cPickle.dump(f, root.config(), -1)
TypeError: argument must have 'write' attribute

Ответы [ 5 ]

5 голосов
/ 28 июня 2010

Записать значение масштаба в файл и прочитать его при запуске. Вот один из способов сделать это (примерно),

CONFIG_FILE = '/path/to/config/file'

root.sclX = ...

try:
    with open(CONFIG_FILE, 'r') as f:
        root.sclX.set(int(f.read()))
except IOError:    # this is what happens if the file doesn't exist
    pass

...
root.mainloop()

# this needs to run when your program exits
with open(CONFIG_FILE, 'w') as f:
    f.write(str(root.sclX.get()))

Очевидно, что вы можете сделать его более надежным / запутанным / сложным, если, например, вы хотите сохранить и восстановить дополнительные значения.

3 голосов
/ 28 июня 2010

Непосредственно перед mainloop:

import cPickle
with open('myconfig.pk', 'wb') as f:
  cPickle.dump(f, root.config(), -1)
  cPickle.dump(f, root.sclX.config(), -1)

и, при последующих запусках (когда файл .pk уже присутствует), соответствующий cPickle.load вызывает, чтобы вернуть его и установить с...config(**k) (также требуется некоторая хитрость, чтобы подтвердить cPickle, что протравленная конфигурация безопасна для перезагрузки, к сожалению).

1 голос
/ 28 июня 2010

Вы можете указать программе написать файл с именем, например, «save.txt», с параметром, а затем загрузить его в следующих случаях:

Есть ли "save.txt"?

Нет: написать новый файл сохранения с параметром. Да: прочитать параметр и передать его в переменную.

Если параметр обновлен, перепишите его в файл.

Я не специалист по Python, но должна быть хорошая библиотека для чтения и записи файлов:)

0 голосов
/ 20 августа 2010

Для постоянного хранения в Python есть хороший модуль: shelve.

например. (Два сценария находятся в одном каталоге)

скрипт 1

import shelve

settings = shelve.open('mySettings')
settings['vroot_directory'] = commands.getoutput("pwd")

сценарий 2

import shelve 

settings = shelve.open('mySettings')
root_directory_script1 = settings['vroot_directory'])   

Rgds,

пс. для более полного примера ответ моего поста от g.d.d.c: Импорт переменных Python программы после ее выполнения

0 голосов
/ 28 июня 2010

Простое использование

help(cPickle.dump)

в интерпретаторе немедленно покажет, что вы должны попробовать изменить код Алекса, поменяв местами f и объект, сохраненный в вызове:

cPickle.dump(root.config(), f, -1)
cPickle.dump(root.sclX.config(), f, -1)
...