You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 17:56:16