为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Python Tkinter 更有效地创建图像显示器?

如何使用 Python Tkinter 更有效地创建图像显示器?

泛舟湖上清波郎朗 2023-07-18 17:34:30
import tkinter as tkfrom PIL import ImageTk, Imageroot = tk.Tk()def photogetter():    ###global photo    photo= ImageTk.PhotoImage(Image.open("smiley.png").resize((320,240)))    label =tk.Label(root,image=photo)    canv.create_window((320,240),window=label)    canv = tk.Canvas(root,width=640,height=480)canv.grid(row=0,column=0)button = tk.Button(root,text="Button",command=photogetter)button.grid(row=1,column=0)root.mainloop()除非我在函数中将photo变量声明为全局变量,否则此代码不起作用。有人可以解释一下为什么我必须将photo变量声明为全局变量吗?使用局部变量对我来说看起来更有效,但它不起作用。
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

这是因为什么时候photo不是由 python 垃圾收集器收集垃圾,因此您需要保留对图像的引用,这可以通过说或 来global完成。不管怎样,你只需要保留一个引用,这样它就不会被垃圾收集。global imagelabel.image = photo

global我听说 OOP 可能效率不高,因为它可能会在以后产生一些问题,所以你可以通过 保留参考label.image = photo

来自 effbot.org:

问题在于 Tkinter/Tk 接口无法正确处理对 Image 对象的引用;Tk 小部件将保存对内部对象的引用,但 Tkinter 不会。当Python的垃圾收集器丢弃Tkinter对象时,Tkinter告诉Tk释放图像。但由于该图像正在被小部件使用,因此 Tk 不会破坏它。不完全的。它只是将图像清空,使其完全透明。

希望这能解决您的疑问。


查看完整回答
反对 回复 2023-07-18
  • 1 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信