Tkinter Canvas控件tag_bind方法引发内存泄漏问题
Tkinter Canvas标签绑定引发内存泄漏问题
运行程序时通过Windows任务管理器可监测到内存占用持续攀升,核心问题表现为:
- 为Canvas控件使用
tag_bind添加绑定后,执行tag_unbind解绑操作无法降低内存占用 - 重复执行绑定操作会导致内存占用持续增长
为放大问题效果,示例代码中循环执行绑定语句数千次,复现代码如下:
from tkinter import * import os, psutil process = psutil.Process(os.getpid()) def showmem(): print(f'{process.memory_info().rss:,}') root = Tk() canvas = Canvas(root) def bind_one(canvas, r) : canvas.tag_unbind(r, "<ButtonPress-1>") # 此操作对内存无影响 def procedure(r, event) : print(r,event) canvas.tag_bind(r, "<ButtonPress-1>", lambda event : procedure(r,event)) def unbind_all(R, canvas) : for r in R : canvas.tag_unbind(r, "<ButtonPress-1>") showmem() Button(root, text = 'unbind', command = lambda : unbind_all(R, canvas)).grid() def rebind_all(R, canvas) : def procedure(r, event) : print(r,event) for r in R : canvas.tag_bind(r, "<ButtonPress-1>", lambda event, r = r : procedure(r, event)) showmem() Button(root, text = 'rebind', command = lambda : rebind_all(R, canvas)).grid() R = [] s = 50 for j in range(6) : for k in range(6) : R += [canvas.create_rectangle(k*s,j*s,(k+1)*s,(j+1)*s, fill = 'white')] x1, y1, x2, y2 = canvas.bbox('all') canvas.config(width=x2, height=y2) showmem() count = 0 for k in range(2000) : for r in R : bind_one(canvas, r) # line A if count == 100 : showmem() count = 0 count += 1 showmem() canvas.grid() mainloop()
内容的提问来源于stack exchange,提问作者agat
相关产品推荐
相关产品推荐

