我几个月来一直在教自己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()
提前致谢
答案 0 :(得分:1)
pack_forget
不会破坏任何东西,只会让它不可见。这是内存泄漏的GUI版本 - 您不断创建对象而不会破坏它们。
所以,要学习的第一课是你应该在完成它时销毁它。
要学习的更重要的一课是,您不必一遍又一遍地破坏和重新创建相同的小部件。您可以使用configure
方法更改显示的文本。例如:
self.utc_time.configure(text="...")
这将使您的程序不使用任何额外的内存,甚至使用(不知不觉)更少的CPU。
答案 1 :(得分:0)
要实际释放小部件的内存,你还应该调用它的.destroy()方法。这样可以防止内存泄漏。
然而,实现这些东西的一种更有效的方法是将字符串变量与Label小部件相关联,如下所示:
v = StringVar()
Label(master, textvariable=v).pack()
v.set("New Text!")
请参阅http://effbot.org/tkinterbook/label.htm以获取参考资料