Tkinter文本和Itemconfigure内存泄漏

时间:2014-03-03 10:01:01

标签: python-2.7 user-interface memory-leaks tkinter

背景

几个月前,我在这里发帖询问我的Tkinter画布类中是否发生内存泄漏。造成这种情况的主要原因是几个键绑定的意外循环,删除这些绑定在很大程度上缓解了我的问题。但是,内存泄漏仍然很少,但我忽略了它可忽略不计。此时(经过几个月的工作之后),之前的小泄漏已经变得可能具有破坏性 - 经过一个小时的连续使用后,我的程序现在可以填充800mb +的系统内存,这是一个严重的问题,因为没有泄漏,程序应该只需要~60mb。

问题:

经过一些测试,我将原点缩小到两个原因:
1. Tkinter项目配置功能
2. Tkinter文本对象
下面的代码片段在我的机器上重新创建了问题。

from Tkinter import *

stop=0

class Interface:
    def Initialise(self,master):
        global x
        self.master=master
        x=50
        width,height=master.winfo_screenwidth(),master.winfo_screenheight()  
        self.c=Canvas(self.master, width=width, height=height, bg='white',scrollregion=(-1500,-1500,10000,10000))
        self.c.pack(side=LEFT,expand=True,fill=BOTH)
        self.Regenerate()
        self.master.bind("<a>", self.auto)

    def Regenerate(self):
        self.G=UI_Canvas()
        self.G.Visualise(self.c,x)

    def auto(self, event):
        global stop
        stop+=1
        self.master.after(5, self.auto_rotate)

    def auto_rotate(self):
        global x
        if stop % 2 == 1:
            x+=0.1
            self.Regenerate()
            self.c.after(5, self.auto_rotate)

class UI_Canvas:
    def Visualise(self, canvas,x):

        self.canvas=canvas
        self.canvas.delete('Network')

        data=[((x,400,0),1),((x,450,0),2),((x+50,450,0),3),((x+50,400,0),4)] 
        for (x,y,z), j in data:
            self.canvas.create_oval(x-5, y-5, x+5, y+5, fill='gray15', tags=(j,("Node %.5s" % j),'Network'))
            #self.canvas.create_text(x-10,y, text=(j), fill='black', font=('Helvetica',12), tags=(j, ("Node %.5s" % j), 'Network'))

root=Tk()
UI=Interface()
UI.Initialise(root)
root.mainloop()

通过注释掉所有文本和itemconfigure对象,泄漏消失,程序以恒定的内存使用率运行(根据需要)。具体来说,注释掉所有文本对象(不保留任何要配置的对象),消除了泄漏,因此在我看来,屏幕上文本的重复刷新导致泄漏。我使用的其他画布对象(线条,椭圆和多边形)不会导致此问题。

尝试解决方案

这里发布的其他内存泄漏问题似乎围绕在循环中进行更新,但我没有依赖此方法,而是删除然后在循环内重新创建对象。如前所述,此方法适用于形状,但显然不适用于文本。我已将文本对象代码移动到我的“主”画布类中(因此不再直接在刷新循环中),而是尝试从循环中对其进行配置,但问题仍然存在。

问题

这些文本对象中包含的信息对于轻松使用我的程序非常重要,解决此问题至关重要。我的问题是:是什么导致了这个问题?有没有可能的解决方案?

提前感谢您的任何帮助!

0 个答案:

没有答案