This question already has answers here:
Why does Tkinter image not show up if created in a function?
(2个答案)
2年前关闭。
我正在尝试在窗口中显示图像。...似乎很简单,对吧?好吧,我有个大虫子!
我在一个文件中有这个完全相同的代码:
import Tkinter
root = Tkinter.Tk()
canvas = Tkinter.Canvas(root)
canvas.grid(row = 0, column = 0)
photo = Tkinter.PhotoImage(file = '/Users/Richy/Desktop/1.gif')
image1 = canvas.create_image(0,0, image=photo)
root.mainloop()
有用。
我在更大的文件中有一部分:
def officialPictureWindow(self):
t = Toplevel(self)
t.wm_title("Official Image")
self.__canvas3 = Canvas(t)
self.__canvas3.grid(row = 0, column = 0)
photo = PhotoImage(file = '/Users/Richy/Desktop/1.gif')
image1 = self.__canvas3.create_image(0,0, image=photo)
没用!
当有人按下我的菜单栏上的按钮时,将调用该函数。我所有其他的菜单栏按钮都可以正常运行并显示其窗口。其他没有图像。
这没有任何错误。只是一个黑屏..有人知道为什么吗?
python大神给出的解决方案
您需要保留对photo
的附加引用,以免在函数末尾过早地收集到垃圾。 An Introduction to Tkinter进一步说明:
注意:当PhotoImage对象由Python进行垃圾收集时(例如,当您从将图片存储在本地变量中的函数返回时),即使Tkinter小部件正在显示该图片,该图片也会被清除。
为了避免这种情况,程序必须保留对图像对象的额外引用。一种简单的方法是将图像分配给小部件属性,如下所示:
label = Label(image=photo)
label.image = photo # keep a reference!
label.pack()
在您的情况下,您可以将图像附加到self
变量或画布上。只要分配给某物,它并不重要。
self.image = photo
#or:
self.__canvas3.image = photo