tkinter - 工作 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()
解决方案
推荐阅读
- javascript - 使用直接 src 链接到后端服务器播放音频时的跨域读取阻塞 (CORB)
- istio - 如果使用 ingressgateway istio,Trace ID 不会转发到 zipkin
- android - 如何在房间中存储多个对象列表 - Android
- java - 用于数组输入的 Jolt 转换 JSON 规范
- google-cloud-platform - 如何更新谷歌云 CDN 中的分布?
- sql-server - SQL Server 合并复制快照同步日志位置在哪里?
- java - Java 客户端未从 Windows 信任库中选择根/中间证书
- .net - 如何触发奥尔良谷物重新激活?
- python - Python - Anaconda - 如何从路径中删除 anaconda(我不想卸载 anaconda)
- python - 在tensorflow中使用字符串张量时grpc服务器内存泄漏?