猿问

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

import tkinter as tk

from PIL import ImageTk, Image

root = 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变量声明为全局变量吗?使用局部变量对我来说看起来更有效,但它不起作用。


泛舟湖上清波郎朗
浏览 85回答 1
1回答

冉冉说

这是因为什么时候photo不是由 python 垃圾收集器收集垃圾,因此您需要保留对图像的引用,这可以通过说或 来global完成。不管怎样,你只需要保留一个引用,这样它就不会被垃圾收集。global imagelabel.image = photoglobal我听说 OOP 可能效率不高,因为它可能会在以后产生一些问题,所以你可以通过 保留参考label.image = photo。来自 effbot.org:问题在于 Tkinter/Tk 接口无法正确处理对 Image 对象的引用;Tk 小部件将保存对内部对象的引用,但 Tkinter 不会。当Python的垃圾收集器丢弃Tkinter对象时,Tkinter告诉Tk释放图像。但由于该图像正在被小部件使用,因此 Tk 不会破坏它。不完全的。它只是将图像清空,使其完全透明。希望这能解决您的疑问。
随时随地看视频慕课网APP

相关分类

Python
我要回答