如何保存和重新加载腌制数据 to/from 一个 tkinter 输入框?

How to save and reload pickled data to/from a tkinter Entry box?

我正在寻找一种方法来保存输入到我的 Tkinter GUI 上 Entry 框中的数据,然后在程序打开时立即将该数据加载回 Entry 框中关闭后。我做了一些研究,发现 Pickle 模块是做这类事情的最佳方式。到目前为止,这是我的代码:

from tkinter import*
import pickle

root = Tk()
root.geometry("200x100")

cooltext = StringVar()

entry1 = Entry(root, textvariable=cooltext)
entry1.pack()

def save():
    text = cooltext.get()
    pickle.dump(text, open("savedtext.dat", "wb"))


btn = Button(root, text="save", command=save).pack()

root.mainloop()

基本上我的代码只是在单击 保存 按钮后将数据保存到 .dat 文件中。如果我输入 "test" 并关闭程序然后打开它,我将如何加载相同的数据,它仍然会显示 "test"?

这可能是加载数据的代码,但我不知道如何将它合并到这里:

text = pickle.load(open("savedtext.dat", "rb"))

首先,您提供的代码存在语法错误。这是

text = pickle.load(open("savedtext.dat", "rb")) 而不是

text = pickle.load(open("savedtext.dat"), "rb"))

如果您想在 Entry 小部件中插入文本,可以使用 entry1.insert("end", text)。它会将 text 中的字符串插入到您的 Entry 小部件中所写内容的末尾。您可以打开该文件(如果存在),然后在您创建 Entry 小部件后检查是否有要插入的内容,如果有,则将其插入。

编辑:正如@martineau 所说,我们应该避免在交互后打开文件而不关闭它。您可以使用类似于下面的代码来读取文件内容,然后将其插入到您的小部件中。

with open("savedtext.dat", "rb") as file:
        text = pickle.load(file)

这可以使用 pickle 来完成,如下所示:

from tkinter import *
import pickle


root = Tk()
root.geometry("200x100")

cooltext = StringVar()

entry1 = Entry(root, textvariable=cooltext)
entry1.pack()


def save():
    text = cooltext.get()
    with open("savedtext.dat", "wb") as pickle_file:
        pickle.dump(text, pickle_file, pickle.HIGHEST_PROTOCOL)

def clear():
    cooltext.set('')

def load():
    with open("savedtext.dat", "rb") as pickle_file:
        text = pickle.load(pickle_file)
    cooltext.set(text)


Button(root, text="Save", command=save).pack()
Button(root, text="Clear", command=clear).pack()
Button(root, text="Load", command=load).pack()

root.mainloop()

我添加了 ClearLoad Button 以及类似命名的函数,以使事情更易于使用(和测试).

注意: 代码中的 btn = Button(root, text="save", command=save).pack() 语句会导致 btn 被赋予值 None,因为pack() 没有 return 任何东西。这没有造成任何伤害,只是因为 btn 再也没有被引用过,但通常你需要在单独的语句中调用 pack()(或 grid()),就像你为Entry 小部件 entry1.