首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python tkinter .pack/.pack_forget内存问题

Python tkinter .pack/.pack_forget内存问题
EN

Stack Overflow用户
提问于 2012-03-28 02:59:15
回答 2查看 1.7K关注 0票数 4

我已经自学了几个月的Python,并开始学习一些GUI技术。

我根据在一本书中找到的一个pack_remove示例编写了这个简单的脚本。我的脚本只是每秒显示本地和UTC时间。即使唯一的区别是小时,我仍然希望每一秒都重新显示。

脚本可以工作,但每次显示时,我的RAM都在不断增加。我开始使用大约4mb,然后在大约2个小时后,脚本使用25mb。这对我来说有一定的意义,但我很好奇是否有一种方法可以每秒显示新的时间,但又可以减少如此简单的时钟显示的内存使用。

或者我正在使用一种低效的技术在GUI中以高频率重新显示数据?

下面是我的代码:

代码语言:javascript
复制
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()    

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-28 06:16:49

pack_forget不会破坏任何东西,它只是让它不可见。这是一个内存泄漏的GUI版本--您一直在创建对象而不销毁它们。

因此,要学到的第一个教训是,当您使用完一个小部件时,应该销毁它。

需要学习的更重要的一课是,您不必一遍又一遍地破坏和重新创建同一个小部件。您可以更改使用configure方法显示的文本。例如:

代码语言:javascript
复制
self.utc_time.configure(text="...")

这将使您的程序不使用任何额外的内存,甚至(在不知不觉中)使用更少的CPU。

票数 1
EN

Stack Overflow用户

发布于 2012-03-28 03:31:29

要真正释放小部件的内存,还应该调用它的.destroy()方法。这可以防止在您的情况下内存泄漏。

但是,更有效的实现方法是将字符串变量与Label小部件关联起来,如下所示:

代码语言:javascript
复制
v = StringVar()
Label(master, textvariable=v).pack()
v.set("New Text!")

有关参考,请参阅http://effbot.org/tkinterbook/label.htm

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9895880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档