Tkinter 使用tk画布(带有图像的绘图应用程序)从画布中删除对象

Tkinter 使用tk画布(带有图像的绘图应用程序)从画布中删除对象,tkinter,tkinter-canvas,Tkinter,Tkinter Canvas,寻找答案和可能的解决办法,以解决一个奇怪的意外效果 我正在制作一个绘图应用程序,它使用磁盘上的.png图像在tk画布上绘制。 阅读垃圾收集和tk画布上的许多线程,但仍然没有人知道为什么会出现这种效果。 您只需复制一个512×512像素宽的图像,并将其放置在以下脚本所在的位置,然后将图像重命名为“default.png”,不带引号。我还在MacPython3.7.3上运行它,在Win10Python3.7.4上也有同样的效果 脚本使用PIL调整default.png的大小,并将其保存为defaul

寻找答案和可能的解决办法,以解决一个奇怪的意外效果

我正在制作一个绘图应用程序,它使用磁盘上的.png图像在tk画布上绘制。 阅读垃圾收集和tk画布上的许多线程,但仍然没有人知道为什么会出现这种效果。 您只需复制一个512×512像素宽的图像,并将其放置在以下脚本所在的位置,然后将图像重命名为“default.png”,不带引号。我还在MacPython3.7.3上运行它,在Win10Python3.7.4上也有同样的效果

脚本使用PIL调整default.png的大小,并将其保存为defaultworkbrush.png到同一工作目录,然后将defaultworkbrush.png加载到绘制此图像的绘制函数中 画布就像普通画笔一样。一切按计划进行。 我还制作了一个小功能,通过右键单击来调整defaultworkbrush.png的大小 当你再次开始画画时,你可以看到画笔已经改变,绘画功能现在用新的“形状”画画。到目前为止还不错

但是当你开始疯狂地在画布上画画时,你的杰作似乎很快就被抹掉了,在连续画画的20秒内。 预期的结果将是能够无限期地绘制,并且随着画布被更多的对象和ram填满,程序会减慢速度。事实并非如此

我该如何解决这个问题?我需要做什么改变才能在画布不删除我的对象的情况下进行绘制?提前谢谢

从tkinter导入*
从PIL导入图像
a1=Image.open('default.png')。convert('RGB'))
a2=a1。调整大小((180180),图像。最近)
brush='defaultworkbrush.png'
a2.保存(刷子)
a1.关闭()
def重新调整大小(事件):
a1=Image.open('defaultworkbrush.png')
a2=a1。调整大小((300100),图像。最近)
brush='defaultworkbrush.png'
a2.保存(刷子)
a1.关闭()
def运动(事件):
x、 y=事件.x,事件.y
返回x,y
def油漆(事件):
Ltk1=PhotoImage(文件='defaultworkbrush.png')
Ltk1.image=Ltk1
he,ha=运动(事件)
cv.创建图像((他,哈),图像=Ltk1)
root=Tk()
cv=画布(根,宽度=1280,高度=600)
cv.pack(展开=否,填充=无,侧面=顶部)
cv.bind(“,重定大小)
cv.bind(“,运动)
cv.bind(“,油漆)
全球Ltk1
Ltk1=PhotoImage(文件='defaultworkbrush.png')
Ltk1.image=Ltk1
root.mainloop()

Ltk1.image=Ltk1
在这里缩进做什么。人们通常将其用于小部件,而不是
PhotoImage
实例。这是我保存PhotoImage引用的唯一方法,我可能用错了,但取消注释会使绘图不显示在画布上。从这里得到的想法是:“为了避免这种情况,程序必须保留一个对图像对象的额外引用。一个简单的方法是将图像分配给一个小部件属性,如:label=label(image=photo)label.image=photo#保留一个引用!label.pack()”这就是我为什么说小部件的原因,不过很好,它可以是任何类似于Ltk1.imaasdasdge=Ltk1的东西,只是为了保持引用,我相信你在这里缩进做什么。人们通常将其用于小部件,而不是
PhotoImage
实例。这是我保存PhotoImage引用的唯一方法,我可能用错了,但取消注释会使绘图不显示在画布上。从这里得到的想法是:“为了避免这种情况,程序必须保留一个对图像对象的额外引用。一个简单的方法是将图像分配给一个小部件属性,如:label=label(image=photo)label.image=photo#保留一个引用!label.pack()”这就是我为什么说小部件的原因,不过很好,它可以是类似于
Ltk1.imaasdasdge=Ltk1
的任何东西,我相信这只是为了保持引用