2012-03-27 33 views
4

我一直在教自己Python幾個月,並開始學習一些GUI技術。Python tkinter .pack/.pack_forget內存問題

我寫了這個簡單的腳本,基於我在書中找到的pack_remove示例。我的腳本每秒只顯示本地和UTC時間。當然,唯一的區別是小時,我仍然希望每秒重新顯示一次。

該腳本的作品,但我的RAM隨着每次顯示不斷增加。我從大約4mb開始,然後2小時左右,腳本使用25mb。這對我來說很有意義,但我很好奇,如果有一種方法每秒都會顯示新的時間,但會減少這種簡單時鐘顯示的內存使用量。

或者我是否使用低效技術在GUI中以高頻重新顯示數據?

這裏是我的代碼:

from tkinter import * 
import time 

class TimeDisplay(Frame): 
    def __init__(self,msecs = 1000): 
     Frame.__init__(self) 
     self.msecs = msecs 
     self.pack() 
     utc_time = Label(self, text='') 
     utc_time.pack() 
     cst_time = Label(self, text='') 
     cst_time.pack() 
     self.utc_time = utc_time 
     self.cst_time = cst_time 
     self.repeater() 

    def repeater(self): 
     self.utc_time.pack_forget() 
     self.cst_time.pack_forget() 
     self.utc_time = Label(self, text= 'UTC: ' + time.strftime('%Y/%m/%d %H:%M:%S',time.gmtime())) 
     self.utc_time.pack() 
     self.utc_time.config(bg='navy',fg='white') 
     self.cst_time = Label(self, text= 'CST: ' + time.strftime('%Y/%m/%d %H:%M:%S',time.localtime())) 
     self.cst_time.pack() 
     self.cst_time.config(bg='navy',fg='white') 
     self.after(self.msecs, self.repeater)   


if __name__ == '__main__': TimeDisplay(msecs=1000).mainloop()  

在此先感謝

回答

1

pack_forget不破壞任何東西,它只是使它不可見的。這是一個內存泄漏的GUI版本 - 您不斷破壞它們而創建對象。

因此,第一課要學習的是,當你完成它時,你應該銷燬一個小部件。

更重要的是要學習的一點是,您不必一次又一次地銷燬和重新創建相同的窗口小部件。您可以更改使用configure方法顯示的文本。例如:

self.utc_time.configure(text="...") 

這將使您的程序不使用任何額外的內存,甚至使用(不知不覺)更少的CPU。

0

要真正免費小工具的記憶,你也應該調用它的.destroy()方法。這可以防止你的情況下的內存泄漏。

但是實現的東西更有效的方式是將字符串變量與標籤控件這樣的聯想:

v = StringVar() 
Label(master, textvariable=v).pack() 
v.set("New Text!") 

看到http://effbot.org/tkinterbook/label.htm參考

+0

嚴格來說,你不需要使用'textvariable'。這是額外的開銷,當你真正需要做的是重新配置文本屬性。 – 2012-03-27 22:18:07