2015-11-05 189 views
0

我想保存並加載我的GUI。保存並加載GUI-tkinter

我做了一個GUI,我希望當我點擊保存按鈕。

它應該將GUI保存在一些數據blob中,當我點擊加載按鈕時,它會再次加載相同的GUI。

我的GUI有各種文本小部件,下拉選項菜單。 我是python的新手,所以有人可以幫我解決這個問題嗎?

我也嘗試過泡菜模塊。

回答

4

你不能做自己想做的事,而不去做自己的工作。您需要編寫一個函數來收集所需的所有數據以恢復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() 
+0

我的GUI有4類和每個類都有被環6-7的功能(稱爲一次又一次)。每個功能都有小部件。那麼,你能建議我如何將它保存到磁盤 – user5517005

+0

什麼是pytkgen? https://github.com/tmetsch/pytkgen – user5517005

+0

@ user5517005:不,我不能。該解決方案對您的應用程序非常具體。 –

0

給出的示例不起作用。它不保存狀態,並給出了error-- 錯誤加載保存的狀態:「STR」不支持緩衝區接口