需要帮助使程序记住设置,cPickle

时间:2010-07-04 06:09:29

标签: python tkinter pickle

重新打开时,如何让此代码记住刻度的最后位置?

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 个答案:

答案 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和变量,都变得无法访问)。