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 image
label.image = photo
global
我听说 OOP 可能效率不高,因为它可能会在以后产生一些问题,所以你可以通过 保留参考label.image = photo
。
来自 effbot.org:
问题在于 Tkinter/Tk 接口无法正确处理对 Image 对象的引用;Tk 小部件将保存对内部对象的引用,但 Tkinter 不会。当Python的垃圾收集器丢弃Tkinter对象时,Tkinter告诉Tk释放图像。但由于该图像正在被小部件使用,因此 Tk 不会破坏它。不完全的。它只是将图像清空,使其完全透明。
希望这能解决您的疑问。
添加回答
举报
0/150
提交
取消