保存并加载GUI-tkinter

时间:2015-11-05 19:31:06

标签: python-3.x serialization tkinter pickle

我想保存并加载我的GUI。

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

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

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

我也试过泡菜模块。

2 个答案:

答案 0 :(得分:5)

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

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

这是一个人为的例子。在弹出的窗口中输入几个表达式。请注意,它们已添加到组合框中。退出时,将保存当前表达式,保存的表达式和当前值。下次启动GUI时,将恢复这些值。

import Tkinter as tk
import 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, "w") 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, "r") 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()

答案 1 :(得分:1)

给出的例子不起作用。它不保存状态并给出错误 - 错误加载保存状态:'str'不支持缓冲区接口