2010-07-05 56 views
0

我已經嘗試了幾次失敗,讓程序在被銷燬後記住設置。造成這種情況的一個重要原因是因爲我沒有示例代碼來解決這個問題。下面我有一個我寫的簡單程序。我喜歡它,以便它能夠記住縮放比例的位置以及重新啓動程序時文本小部件的內容。我討厭不得不要求某人爲我寫代碼,但我老實說卡住了。我想讓這個程序記住設置

我在Windows 7上使用Python 2.6.5,順便說一句。

代碼:

import Tkinter 


class simpleapp_tk(Tkinter.Tk): 
    def __init__(self,parent): 
     Tkinter.Tk.__init__(self,parent) 
     self.parent = parent 
     self.initialize() 

    def initialize(self): 
     self.sclX = Tkinter.Scale(self, from_=0, to=100, orient='horizontal',resolution=1,command=self.A) 
     self.sclX.pack(ipadx=75) 


     self.labelVar = Tkinter.StringVar() 
     self.label = Tkinter.Label(self,textvariable=self.labelVar) 
     self.label.pack(ipadx=75) 


     self.frame = Tkinter.Frame(self,relief='ridge',borderwidth=4) 
     self.frame.pack() 
     self.LVariable = Tkinter.StringVar() 
     self.s = Tkinter.Scrollbar(self.frame) 
     self.L = Tkinter.Text(self.frame,borderwidth=0,font=('Arial', 10),width=30, height=15) 
     self.s.config(command=self.L.yview,elementborderwidth=1) 
     self.L.grid(column=0,row=0,sticky='EW') 
     self.s.grid(column=1,row=0,sticky='NSEW') 


    def A(self, event): 
     self.labelVar.set(100 - self.sclX.get()) 


if __name__ == "__main__": 
    app = simpleapp_tk(None) 
    app.mainloop() 
+0

老實說,我不知道給這個問題一個什麼樣的答案。如果你具體說明你的問題 - 你以前的問題在這方面更好,那會更好。 – 2010-07-05 02:40:45

+0

我試了幾次,所有的代碼都失敗了。我所需要的只是讓一個代碼工作一次,所以我可以通過反覆試驗來構建它。 – rectangletangle 2010-07-05 02:44:56

+1

@anteater,你有什麼嘗試?上面的代碼與持久設置沒有任何關係。我會推薦嘗試[configparser](http://docs.python.org/library/configparser.html),它是內置於標準庫中的。有一些示例,包括[文檔頁面本身](http://docs.python.org/library/configparser.html#examples)。 – 2010-07-05 02:47:29

回答

1

你以前的問題,你有困難使用cPickle保存狀態是一個好的開始。

我在代碼中添加了幾個方法,現在它將使用pickle模塊保存並加載ScaleText小部件中的數據。我從來沒有使用過Shelve--這聽起來像根據g.d.d.c在他的(?)答案中所說的那樣會更容易。

我將小部件值存儲在字典中,然後醃製字典。

import Tkinter 
import pickle 

class simpleapp_tk(Tkinter.Tk): 
    def __init__(self, parent=None): 
     Tkinter.Tk.__init__(self, parent) 
     self.parent = parent 
     self.initialize() 
     self.load_data() 
     self.protocol("WM_DELETE_WINDOW", self.save_data) 

    def initialize(self): 
     self.sclX = Tkinter.Scale(self, from_=0, to=100, orient='horizontal', 
      resolution=1,command=self.update_label) 
     self.sclX.pack(ipadx=75) 

     self.labelVar = Tkinter.StringVar() 
     self.label = Tkinter.Label(self,textvariable=self.labelVar) 
     self.label.pack(ipadx=75) 

     self.frame = Tkinter.Frame(self,relief='ridge',borderwidth=4) 
     self.frame.pack() 
     #self.LVariable = Tkinter.StringVar() 
     self.s = Tkinter.Scrollbar(self.frame) 
     self.L = Tkinter.Text(self.frame, borderwidth=0, font=('Arial', 10), 
      width=30, height=15) 
     self.s.config(command=self.L.yview, elementborderwidth=1) 
     self.L.grid(column=0, row=0, sticky='EW') 
     self.s.grid(column=1, row=0, sticky='NSEW') 

    def update_label(self, event): 
     self.labelVar.set(100 - self.sclX.get()) 

    def save_data(self): 
     data = {'scale': self.sclX.get(), 'text': self.L.get('1.0', 'end')} 
     with file('config.data', 'wb') as f: 
      pickle.dump(data, f) 
     self.destroy() 

    def load_data(self): 
     try: 
      with file('config.data', 'rb') as f: 
       data = pickle.load(f) 
       self.sclX.set(data['scale']) 
       self.L.insert("end", data['text']) 
     except IOError: 
      # no config file exists 
      pass 

if __name__ == "__main__": 
    app = simpleapp_tk() 
    app.mainloop() 
+0

謝謝,這正是我一直在尋找的。現在我有一個足夠的示例代碼來處理它。 – rectangletangle 2010-07-05 11:26:56

3

這不是要求人們編寫代碼,但你知道要尋找什麼,你可以以後自己編寫代碼的問題!

我想記住設置像你描述的兩種方式的通常做法:

  1. 配置文件
  2. 註冊表項

您可以在儲值無論從配置文件然後讀/註冊表,每當你的程序加載,並調整參數匹配。

所以,現在你去看看你如何讀/寫文件/註冊表項,你設置!

2

根據您喜歡存儲設置的方式,您還可以查看諸如Shelve和Pickle/cPickle之類的東西。我個人更喜歡Shelve,因爲我傾向於使用詞典作爲設置容器,Shelve讓我按原樣存儲它們。完整的文檔可在這裏找到:http://docs.python.org/library/shelve.html