【问题标题】:Need help making a program remember settings, cPickle需要帮助使程序记住设置,cPickle
【发布时间】:2010-07-04 06:09:29
【问题描述】:

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

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

【问题讨论】:

  • 看起来您需要加载您腌制的对象(如果可用)。围绕 Tkinter.Scale 位的“if”语句应该可以解决问题。只需检查腌制对象是否存在,如果存在,则使用它来加载值。如果不按现在的默认值开始。
  • @blackkettle:这可能是一个答案 ;-)
  • 我可以看一个示例代码吗?我是 cPickle 的新手。

标签: python tkinter pickle


【解决方案1】:

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

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 以便可以在全局变量 place 中始终跟踪刻度的位置(通过后面的函数 tracer)(使用 OOP 并避免使用全局变量会更优雅,但我试图让你的事情变得简单;-)。

然后,如果.pk 文件可读,try/except/else 语句会更改place 的设置。你从来没有试图读回你保存的内容。

最后但并非最不重要的一点是,我将保存操作移至 mainloop 退出后,并对其进行了简化(您不需要所有配置字典 - 无论如何您都无法访问 - 只是place 全球)。您在主循环开始之前保存,因此“保存”了初始值(不是那些由主循环执行更改的值)。

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

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多