此代码有效:

img = PhotoImage(file="Image.gif")

Label(root, image=img).pack()


为什么这种方式行不通?

Label(root, image=PhotoImage(file="Image.gif")).pack()


不可能将所有内容都放在一行中吗?

最佳答案

问题不在于语法,而在于垃圾回收。以您的缩写形式:

Label(root, image=PhotoImage(file="Image.gif")).pack()


指向PhotoImage()返回的图像的指针永远不会保存,因此图像会被垃圾回收并且不会显示。以您更长的形式:

img = PhotoImage(file="Image.gif")

Label(root, image=img).pack()


您正在握住指向图像的指针,因此一切正常。您可以通过将工作代码包装在一个函数中并在该函数中设置img本地来使自己相信这一点:

from tkinter import *

root = Tk()

def dummy():
    img = PhotoImage(file="Image.gif")

    Label(root, image=img).pack()

dummy()

mainloop()


现在,它将不再显示,因为img会在函数返回时消失,并且图像会被垃圾回收。现在,返回图像并将返回的值保存在变量中:

def dummy():
    img = PhotoImage(file="Image.gif")

    Label(root, image=img).pack()

    return img

saved_ref = dummy()


然后您的图像再次起作用!常见的解决方法如下:

def dummy():
    img = PhotoImage(file="Image.gif")

    label = Label(root, image=img)
    label.image_ref = img  # make a reference that persists as long as label

    label.pack()

dummy()


但是您可以看到,我们已经远离单线!

关于python - tkinter和图书馆PhotoImage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53767332/

10-16 07:00