Tkinter消失PhotoImage问题[重复]

Posted

技术标签:

【中文标题】Tkinter消失PhotoImage问题[重复]【英文标题】:Tkinter vanishing PhotoImage issue [duplicate] 【发布时间】:2015-02-10 09:31:53 【问题描述】:

我正在尝试在窗口中显示图像...看起来很简单,对吧?好吧,我有一个大错误!

我在一个文件中有这个完全相同相同的代码:

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)

没用!

当有人按下我拥有的菜单栏上的按钮时,将调用该函数。我拥有的所有其他菜单栏按钮都可以正常运行并显示它们的窗口。不过其他的都没有图片。

这不会出错。只是一个空白屏幕。有谁知道为什么?

【问题讨论】:

【参考方案1】:

您需要保留对photo 的附加引用,这样它就不会在函数结束时过早地被垃圾回收。 An Introduction to Tkinter 进一步解释:

注意:当 Python 对 PhotoImage 对象进行垃圾收集时(例如,当您从将图像存储在局部变量中的函数返回时),即使 Tkinter 小部件正在显示该图像,该图像也会被清除。

为避免这种情况,程序必须保留对图像对象的额外引用。一种简单的方法是将图像分配给小部件属性,如下所示:

label = Label(image=photo)label.image = photo # keep a reference!label.pack()

在您的情况下,您可以将图像附加到您的 self 变量,或者可能是画布。这并不重要,只要它被分配给某个东西。

self.image = photo
#or:
self.__canvas3.image = photo

【讨论】:

非常感谢。它奏效了。 label = Label(image=photo),所以我认为标签对象中已经引用了照片, 它在创建 photo 对象的行中引用,但 photo 的引用计数在表达式结束时仍降至零,并且 photo 不再存在。这种行为可能令人惊讶,因为大多数自定义类将至少保留一个对以后需要使用的任何参数的引用。但是 Label 和其他 Tkinter 小部件本质上是对用 C 实现的 Tcl 类的薄包装,它们不会竭尽全力处理其参数的引用计数。

以上是关于Tkinter消失PhotoImage问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python Tkinter PhotoImage

PhotoImage Tkinter 问题:按钮不起作用且不显示

Python3 Tkinter基础 Text Photoimage 文本框中插入一张图片

ImageTk.PhotoImage 崩溃

使用 Tkinter 和 Python 提升图像

Tkinter:将具有透明背景的图像添加到按钮