背景
几个月前,我在这里发帖询问我的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对象,泄漏消失,程序以恒定的内存使用率运行(根据需要)。具体来说,注释掉所有文本对象(不保留任何要配置的对象),消除了泄漏,因此在我看来,屏幕上文本的重复刷新导致泄漏。我使用的其他画布对象(线条,椭圆和多边形)不会导致此问题。
尝试解决方案
这里发布的其他内存泄漏问题似乎围绕在循环中进行更新,但我没有依赖此方法,而是删除然后在循环内重新创建对象。如前所述,此方法适用于形状,但显然不适用于文本。我已将文本对象代码移动到我的“主”画布类中(因此不再直接在刷新循环中),而是尝试从循环中对其进行配置,但问题仍然存在。
的问题
这些文本对象中包含的信息对于轻松使用我的程序非常重要,解决此问题至关重要。我的问题是:是什么导致了这个问题?有没有可能的解决方案?
提前感谢您的任何帮助!