【问题标题】:Save and Load GUI-tkinter保存和加载 GUI-tkinter
【发布时间】:2015-11-05 19:31:06
【问题描述】:

我想保存并加载我的 GUI。

我已经制作了一个 GUI,当我点击保存按钮时我想要它。

它应该将 GUI 保存在一些数据块中,当我单击加载按钮时,它将再次加载相同的 GUI。

我的 GUI 有各种文本小部件,下拉选项菜单。 我是python新手,请问有人可以帮我吗?

我也试过泡菜模块。

【问题讨论】:

    标签: python-3.x serialization tkinter pickle


    【解决方案1】:

    如果不自己动手,你就无法做你想做的事。您需要编写一个函数来收集恢复 GUI 所需的所有数据,然后将其保存到磁盘。然后,当 GUI 启动时,您可以读取数据并重新配置小部件以包含这些数据。

    Tkinter 几乎为您提供了完成它所需的一切,但您必须自己完成所有工作。腌制 GUI 不起作用。

    这是一个人为的例子。在弹出的窗口中输入几个表达式。请注意,它们已添加到组合框中。退出时,当前表达式、已保存的表达式和当前值都将被保存。下次启动 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 有 4 个类,每个类有 6-7 个循环的函数(一次又一次地调用)。每个功能都有小部件。那么,您能建议我如何将其保存到磁盘
    • @user5517005:不,我不能。该解决方案非常适合您的应用程序。
    • “保存到磁盘”是什么意思?是否保存配置文件
    • 你能举个例子吗
    • @user5517005:我已经用一个例子更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多