此代码有效:
img = PhotoImage(file="Image.gif")
Label(root, image=img).pack()
这种方式怎么行不通?
Label(root, image=PhotoImage(file="Image.gif")).pack()
不可能把所有东西都放在一条线上吗?
此代码有效:
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()
但是你可以看到我们已经远离单线!
在第一个版本中,img
保留对图像的引用。
在第二个版本中,没有引用该图像并pack()
返回None