Нужна помощь, чтобы программа запомнила настройки, cPickle - PullRequest
1 голос
/ 04 июля 2010

Как мне заставить этот код запоминать последнюю позицию шкалы после повторного открытия?

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(root.config(), f, -1);
    cPickle.dump(root.sclX.config(), f, -1);
root.mainloop()

1 Ответ

2 голосов
/ 04 июля 2010

Вам нужно много изменений и исправлений, чтобы ваш код работал как задумано:

import Tkinter
import cPickle

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

try:
    with open('myconfig.pk', 'rb') as f:
    place = cPickle.load(f)
except IOError:
    pass
else:
    root.place.set(place)

def tracer(*a):
    global place
    place = root.place.get()
root.place.trace('r', tracer)

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

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

Давайте посмотрим на изменения сверху.Я ввел переменную Tkinter root.place, чтобы положение шкалы можно было отслеживать в любое время (через более позднюю функцию tracer) в глобальной переменной place (было бы более элегантно использовать ООП и избегать глобальных переменных, но я пытаюсь сделать все проще для вас; -).

Затем оператор try / исключением / else изменяет настройку place, если файл .pk доступен для чтения.Вы никогда не пытались прочитать назад то, что сохранили.

И последнее, но не менее важное: я перенес операцию сохранения после выхода из mainloop и упростил ее (вам не нужны все словари конфигурации -- к которому вы все равно не можете получить доступ в данный момент - просто place global).Вы сохраняли до начала mainloop, поэтому "сохраняли" начальные значения (не те, которые были изменены при выполнении основного цикла).

Вызовы функций tracer и .trace гарантируют, чтоГлобальная переменная place всегда записывает последнюю позицию шкалы, чтобы ее можно было восстановить и сохранить после выхода из основного цикла (после выхода из основного цикла все объекты Tkinter, как объекты с графическим интерфейсом, так и переменные, становятся недоступными).

...