如何保存和重新加载腌制数据 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()
我添加了 Clear 和 Load Button
以及类似命名的函数,以使事情更易于使用(和测试).
注意: 代码中的 btn = Button(root, text="save", command=save).pack()
语句会导致 btn
被赋予值 None
,因为pack()
没有 return 任何东西。这没有造成任何伤害,只是因为 btn
再也没有被引用过,但通常你需要在单独的语句中调用 pack()
(或 grid()
),就像你为Entry
小部件 entry1
.
我正在寻找一种方法来保存输入到我的 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()
我添加了 Clear 和 Load Button
以及类似命名的函数,以使事情更易于使用(和测试).
注意: 代码中的 btn = Button(root, text="save", command=save).pack()
语句会导致 btn
被赋予值 None
,因为pack()
没有 return 任何东西。这没有造成任何伤害,只是因为 btn
再也没有被引用过,但通常你需要在单独的语句中调用 pack()
(或 grid()
),就像你为Entry
小部件 entry1
.