首页 > 解决方案 > 工作 tk 画布(带有图像的绘图应用程序)从画布中删除对象

问题描述

寻求答案和可能的解决方案来解决奇怪的意外影响。

我正在制作一个绘图应用程序,它使用磁盘中的 .png 图像在 tk 画布上进行绘制。在垃圾收集和 tk 画布上阅读了许多线程,但仍然不知道为什么会出现这种效果。您需要复制的只是拥有一个 512 x 512 像素宽的图像并将其放置在以下脚本所在的位置,并将您的图像重命名为“default.png”,不带引号。我也在mac python 3.7.3上运行这个并且对win 10 python 3.7.4有同样的效果

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

但是当你刚开始发疯并在画布上画画时,你的杰作会在连续绘画的 20 秒内看似随机地很快被擦除。预期的结果将是能够无限期地绘制并且随着画布被更多的对象和内存填满而导致程序变慢。事实并非如此。

我该如何解决?我必须改变什么才能在画布不删除我的对象的情况下进行绘制?提前致谢。

from tkinter import *
from PIL import Image

a1=Image.open('default.png').convert('RGB')
a2=a1.resize((180,180), Image.NEAREST)
brush='defaultworkbrush.png'
a2.save(brush)
a1.close()

def resizzle(event):
    a1=Image.open('defaultworkbrush.png')
    a2=a1.resize((300,100), Image.NEAREST)
    brush='defaultworkbrush.png'
    a2.save(brush)
    a1.close()

def motion(event):
    x,y=event.x,event.y
    return x,y

def paint(event):
    Ltk1=PhotoImage(file='defaultworkbrush.png')
    Ltk1.image=Ltk1
    he,ha=motion(event)
    cv.create_image((he, ha), image=Ltk1)
           
root=Tk()

cv=Canvas(root, width=1280, height=600)
cv.pack(expand=NO, fill=NONE, side=TOP)
cv.bind("<Button-3>",resizzle)
cv.bind("<Motion>",motion)
cv.bind("<B1-Motion>",paint)

global Ltk1
Ltk1=PhotoImage(file='defaultworkbrush.png')
Ltk1.image=Ltk1

root.mainloop()

标签: tkintertkinter-canvas

解决方案


推荐阅读