保存和加载 GUI-tkinter
Save and Load GUI-tkinter
我想保存并加载我的 GUI。
我制作了一个 GUI,当我点击保存按钮时我想要它。
它应该将 GUI 保存在一些数据块中,当我单击加载按钮时,它会再次加载相同的 GUI。
我的 GUI 有各种文本小部件,下拉选项菜单。
我是 python 的新手,有人可以帮助我吗?
我也试过 pickle 模块。
如果不自己动手,就无法做自己想做的事。您需要编写一个函数来收集恢复 GUI 所需的所有数据,然后您可以将其保存到磁盘。然后,当 GUI 启动时,您可以读取数据并重新配置小部件以包含该数据。
Tkinter 为您提供了完成它所需的几乎所有内容,但您必须自己完成所有工作。腌制 GUI 将不起作用。
这是一个人为的例子。在弹出的 window 中输入几个表达式。请注意,它们已添加到组合框中。退出时,当前表达式、保存的表达式和当前值都被保存。下次启动 GUI 时,将恢复这些值。
try:
import Tkinter as tk
import ttk
except ModuleNotFoundError:
import tkinter as tk
import tkinter.ttk as ttk
import pickle
FILENAME = "save.pickle"
class Example(tk.Frame):
def __init__(self, parent):
self.create_widgets(parent)
self.restore_state()
def create_widgets(self, parent):
tk.Frame.__init__(self, parent, borderwidth=9, relief="flat")
self.previous_values = []
l1 = tk.Label(self, text="Enter a mathematical expression:", anchor="w")
l2 = tk.Label(self, text="Result:", anchor="w")
self.expressionVar = tk.StringVar()
self.expressionEntry = ttk.Combobox(self, textvariable=self.expressionVar, values=("No recent values",))
self.resultLabel = tk.Label(self, borderwidth=2, relief="groove", width=1)
self.goButton = tk.Button(self, text="Calculate!", command=self.calculate)
l1.pack(side="top", fill="x")
self.expressionEntry.pack(side="top", fill="x", padx=(12, 0))
l2.pack(side="top", fill="x")
self.resultLabel.pack(side="top", fill="x", padx=(12, 0), pady=4)
self.goButton.pack(side="bottom", anchor="e", pady=4)
self.expressionEntry.bind("<Return>", self.calculate)
# this binding saves the state of the GUI, so it can be restored later
root.wm_protocol("WM_DELETE_WINDOW", self.save_state)
def calculate(self, event=None):
expression = self.expressionVar.get()
try:
result = "%s = %s" % (expression, eval(expression))
self.previous_values.append(expression)
self.previous_values = self.previous_values[-8:]
self.expressionVar.set("")
self.expressionEntry.configure(values=self.previous_values)
except:
result = "invalid expression"
self.resultLabel.configure(text=str(result))
def save_state(self):
try:
data = {
"previous": self.previous_values,
"expression": self.expressionVar.get(),
"result": self.resultLabel.cget("text"),
}
with open(FILENAME, "wb") as f:
pickle.dump(data, f)
except Exception as e:
print
"error saving state:", str(e)
root.destroy()
def restore_state(self):
try:
with open(FILENAME, "rb") as f:
data = pickle.load(f)
self.previous_values = data["previous"]
self.expressionEntry.configure(values=self.previous_values)
self.expressionVar.set(data["expression"])
self.resultLabel.configure(text=data["result"])
except Exception as e:
print
"error loading saved state:", str(e)
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
我想保存并加载我的 GUI。
我制作了一个 GUI,当我点击保存按钮时我想要它。
它应该将 GUI 保存在一些数据块中,当我单击加载按钮时,它会再次加载相同的 GUI。
我的 GUI 有各种文本小部件,下拉选项菜单。 我是 python 的新手,有人可以帮助我吗?
我也试过 pickle 模块。
如果不自己动手,就无法做自己想做的事。您需要编写一个函数来收集恢复 GUI 所需的所有数据,然后您可以将其保存到磁盘。然后,当 GUI 启动时,您可以读取数据并重新配置小部件以包含该数据。
Tkinter 为您提供了完成它所需的几乎所有内容,但您必须自己完成所有工作。腌制 GUI 将不起作用。
这是一个人为的例子。在弹出的 window 中输入几个表达式。请注意,它们已添加到组合框中。退出时,当前表达式、保存的表达式和当前值都被保存。下次启动 GUI 时,将恢复这些值。
try:
import Tkinter as tk
import ttk
except ModuleNotFoundError:
import tkinter as tk
import tkinter.ttk as ttk
import pickle
FILENAME = "save.pickle"
class Example(tk.Frame):
def __init__(self, parent):
self.create_widgets(parent)
self.restore_state()
def create_widgets(self, parent):
tk.Frame.__init__(self, parent, borderwidth=9, relief="flat")
self.previous_values = []
l1 = tk.Label(self, text="Enter a mathematical expression:", anchor="w")
l2 = tk.Label(self, text="Result:", anchor="w")
self.expressionVar = tk.StringVar()
self.expressionEntry = ttk.Combobox(self, textvariable=self.expressionVar, values=("No recent values",))
self.resultLabel = tk.Label(self, borderwidth=2, relief="groove", width=1)
self.goButton = tk.Button(self, text="Calculate!", command=self.calculate)
l1.pack(side="top", fill="x")
self.expressionEntry.pack(side="top", fill="x", padx=(12, 0))
l2.pack(side="top", fill="x")
self.resultLabel.pack(side="top", fill="x", padx=(12, 0), pady=4)
self.goButton.pack(side="bottom", anchor="e", pady=4)
self.expressionEntry.bind("<Return>", self.calculate)
# this binding saves the state of the GUI, so it can be restored later
root.wm_protocol("WM_DELETE_WINDOW", self.save_state)
def calculate(self, event=None):
expression = self.expressionVar.get()
try:
result = "%s = %s" % (expression, eval(expression))
self.previous_values.append(expression)
self.previous_values = self.previous_values[-8:]
self.expressionVar.set("")
self.expressionEntry.configure(values=self.previous_values)
except:
result = "invalid expression"
self.resultLabel.configure(text=str(result))
def save_state(self):
try:
data = {
"previous": self.previous_values,
"expression": self.expressionVar.get(),
"result": self.resultLabel.cget("text"),
}
with open(FILENAME, "wb") as f:
pickle.dump(data, f)
except Exception as e:
print
"error saving state:", str(e)
root.destroy()
def restore_state(self):
try:
with open(FILENAME, "rb") as f:
data = pickle.load(f)
self.previous_values = data["previous"]
self.expressionEntry.configure(values=self.previous_values)
self.expressionVar.set(data["expression"])
self.resultLabel.configure(text=data["result"])
except Exception as e:
print
"error loading saved state:", str(e)
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()