2012-03-27 71 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