重新打开时,如何让此代码记住刻度的最后位置?
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()
答案 0 :(得分:2)
您需要进行许多更改和修复才能使代码按预期工作:
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
)(它会更优雅使用OOP并避免使用全局变量,但我正在努力让事情变得简单; - )。
然后,如果place
文件可读,则try / except / else语句会更改.pk
的设置。你从来没有试图回读你所保存的东西。
最后但并非最不重要的是,我已经将保存操作移至mainloop退出后,并将其简化(您不需要所有配置词典 - 无论如何您无法访问 - 只是全球place
。您在 mainloop启动之前保存了,因此“保存”了初始值(不是主循环执行所改变的值)。
tracer
函数和.trace
方法调用确保全局变量place
始终记录比例的最新位置 - 以便在mainloop退出后可以恢复并保存(在mainloop退出之后,所有Tkinter对象,包括GUI和变量,都变得无法访问)。