我已经自学了几个月的Python,并开始学习一些GUI技术。
我根据在一本书中找到的一个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() 提前感谢
发布于 2012-03-28 06:16:49
pack_forget不会破坏任何东西,它只是让它不可见。这是一个内存泄漏的GUI版本--您一直在创建对象而不销毁它们。
因此,要学到的第一个教训是,当您使用完一个小部件时,应该销毁它。
需要学习的更重要的一课是,您不必一遍又一遍地破坏和重新创建同一个小部件。您可以更改使用configure方法显示的文本。例如:
self.utc_time.configure(text="...")这将使您的程序不使用任何额外的内存,甚至(在不知不觉中)使用更少的CPU。
发布于 2012-03-28 03:31:29
要真正释放小部件的内存,还应该调用它的.destroy()方法。这可以防止在您的情况下内存泄漏。
但是,更有效的实现方法是将字符串变量与Label小部件关联起来,如下所示:
v = StringVar()
Label(master, textvariable=v).pack()
v.set("New Text!")有关参考,请参阅http://effbot.org/tkinterbook/label.htm
https://stackoverflow.com/questions/9895880
复制相似问题