1

此代码有效:

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

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

这种方式怎么行不通?

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

不可能把所有东西都放在一条线上吗?

4

2 回答 2

1

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

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()

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

于 2018-12-13T18:08:14.610 回答
0

在第一个版本中,img保留对图像的引用。

在第二个版本中,没有引用该图像并pack()返回None

于 2018-12-13T17:45:01.393 回答