如何将腌制数据保存到/从 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()
我添加了 Clear 和 Load Button
以及类似名称的函数,以使事情更易于使用(和测试)。
注意:像 btn = Button(root, text="save", command=save).pack()
这样的语句在您的代码中会导致 btn
被分配值 None
,因为 pack()
不返回任何内容。这没有造成任何伤害,但只是因为 btn
没有被再次引用,但通常您需要在单独的语句中调用 pack()
(或 grid()
),就像您为 Entry
小部件 @ 所做的那样987654332@.
【讨论】:
以上是关于如何将腌制数据保存到/从 tkinter 输入框重新加载?的主要内容,如果未能解决你的问题,请参考以下文章
Python多处理-TypeError:无法腌制'_tkinter.tkapp'对象
BootStrap3 的模态框重有一个保存按钮.点击保存如何关闭模态框.隐藏关闭不起作用..