如何将腌制数据保存到/从 tkinter 输入框重新加载?

Posted

技术标签:

【中文标题】如何将腌制数据保存到/从 tkinter 输入框重新加载?【英文标题】:How to save and reload pickled data to/from a tkinter Entry box? 【发布时间】:2019-02-13 17:44:13 【问题描述】:

我正在寻找一种方法来保存在我的 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()

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

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

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

【问题讨论】:

我认为泡菜不一定是最好的,但它肯定是一种选择。 【参考方案1】:

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

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

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

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

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

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

【讨论】:

虽然基本上是正确的想法,但通常最好避免调用open(),而不调用close(),因为对前者的每次调用都会创建一个单独的file 对象。这对于为写入而打开的文件可能很重要,因为写入可能会被缓冲并且实际上还没有写入磁盘——调用close() 可以确保这一点。一个非常好的方法是通过with statement,因为即使文件打开时发生异常,它也会确保发生这种情况。 这很重要,我会在我的回答中写下这个细节。谢谢。 您可以从答案的已编辑部分中删除 file.close(),因为关闭操作是在 with 语句的上下文中自动执行的。 哦,这对我来说是新的。谢谢你的信息。【参考方案2】:

这可以使用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() 不返回任何内容。这没有造成任何伤害,但只是因为 btn 没有被再次引用,但通常您需要在单独的语句中调用 pack()(或 grid()),就像您为 Entry 小部件 @ 所做的那样987654332@.

【讨论】:

以上是关于如何将腌制数据保存到/从 tkinter 输入框重新加载?的主要内容,如果未能解决你的问题,请参考以下文章

Python多处理-TypeError:无法腌制'_tkinter.tkapp'对象

如何将输入键绑定到 tkinter 按钮

BootStrap3 的模态框重有一个保存按钮.点击保存如何关闭模态框.隐藏关闭不起作用..

Python - 如何使这个不可腌制的对象可腌制?

如何将捕获的输入从 tkinter 条目小部件写入 json 文件

将画布从 tkinter 保存到文件