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

Python 需要帮助使程序记住设置,cPickle,python,tkinter,pickle,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('m

如何使此代码在重新打开时记住天平的最后位置

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()

要使代码按预期工作,您需要进行许多更改和修复:

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);
让我们从顶部看一下变化。我已经在全局变量
place
中引入了一个Tkinter变量
root.place
,这样就可以随时跟踪标尺的位置(通过稍后的函数
tracer
)(使用OOP和避免全局变量会更优雅,但我试图让事情对您来说更简单;-)

然后,如果
.pk
文件可读,try/except/else语句将更改
place
的设置。你从来没有试着读回你所保存的东西

最后但并非最不重要的一点是,我将save操作移到了mainloop退出后,并对其进行了简化(您不需要所有的配置字典——您当时无论如何都无法访问这些字典——只需要
place
global)。您是在mainloop启动之前保存的,因此“保存”了初始值(不是那些由mainloop执行更改的值)


tracer
函数和
.trace
方法调用确保全局变量
place
始终记录标尺的最新位置,以便在退出mainloop后可以恢复和保存标尺(退出mainloop后,所有Tkinter对象,包括GUI对象和变量,都变得不可访问).

如果对象可用,则您可能需要加载该对象。Tkinter.Scale位周围的“if”语句应该可以实现这一点。只需检查pickle对象是否存在,如果存在,则使用它加载值。如果不是现在的默认值,@blackcattle:这可能是一个答案;-)我可以看一个示例代码吗?我是新来的。