如何让Python记住设置?

1 投票
6 回答
4362 浏览
提问于 2025-04-16 00:29

我写了下面这个漂亮的Python示例代码。现在我想知道怎么做才能让程序在退出后重新启动时记住上次滑块的位置?

import Tkinter

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')
root.mainloop()

编辑:

我尝试了以下代码

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(f, root.config(), -1)
    cPickle.dump(f, root.sclX.config(), -1)
root.mainloop()

但是出现了以下错误

Traceback (most recent call last):
  File "<string>", line 244, in run_nodebug
  File "C:\Python26\pickleexample.py", line 17, in <module>
    cPickle.dump(f, root.config(), -1)
TypeError: argument must have 'write' attribute

6 个回答

1

你可以让程序创建一个叫做“save.txt”的文件,并把参数写进去,然后在后续的运行中加载这个文件:

有没有“save.txt”这个文件?

没有:就创建一个新的保存文件,把参数写进去。

有:就读取这个参数,并把它传递给一个变量。

如果参数有更新,就把它重新写入文件。

我对Python不是很专业,但应该有一些不错的库可以用来读写文件 :)

3

mainloop之前:

import cPickle
with open('myconfig.pk', 'wb') as f:
  cPickle.dump(f, root.config(), -1)
  cPickle.dump(f, root.sclX.config(), -1)

而在后续的运行中(当.pk文件已经存在时),会用相应的cPickle.load来读取这个文件,并通过...config(**k)来设置它(不过,这里需要一些技巧来确认cPickle可以安全地重新加载这个保存的配置,真是麻烦)。

5

把比例值写入一个文件,然后在启动时读取它。下面是一个大致的做法:

CONFIG_FILE = '/path/to/config/file'

root.sclX = ...

try:
    with open(CONFIG_FILE, 'r') as f:
        root.sclX.set(int(f.read()))
except IOError:    # this is what happens if the file doesn't exist
    pass

...
root.mainloop()

# this needs to run when your program exits
with open(CONFIG_FILE, 'w') as f:
    f.write(str(root.sclX.get()))

显然,如果你想保存和恢复更多的值,你可以把这个过程做得更复杂、更精细。

撰写回答