Если я отслеживаю диспетчер задач Windows во время работы моей программы, я вижу, что показатель использования памяти постоянно увеличивается. Я написал прилагаемый код, чтобы продемонстрировать проблему. Как только tag_bind был добавлен к холсту, как бы я ни пытался отвязать объекты холста, использование памяти никогда не снижается, и последующие привязки требуют все больше и больше.
Я запускал операторы привязки тысячи раз. раз, чтобы усилить эффект.
мой код:
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, "") #This has no effect on memory
def procedure(r, event) : print(r,event)
canvas.tag_bind(r, "", lambda event : procedure(r,event))
def unbind_all(R, canvas) :
for r in R : canvas.tag_unbind(r, "")
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, "", 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()
Подробнее здесь: https://stackoverflow.com/questions/787 ... emory-leak