Вам нужно много изменений и исправлений, чтобы ваш код работал как задумано:
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, как объекты с графическим интерфейсом, так и переменные, становятся недоступными).