Tkinter 主循环和映像打包必须位于同一代码段中?



下面的示例根本不会显示图像:

from tkinter import *
def main(root):
img = PhotoImage(file="image.png")
Label(image=img).pack()

if __name__ == "__main__":
root = Tk()
main(root)
root.mainloop()

但是如果我将mainloop移动到main或在函数外部执行它们,它将起作用:

root = Tk()
img = PhotoImage(file="image.png")
Label(image=img).pack()
root.mainloop()

也尝试使用grid但有同样的问题.
有人可以解释这背后的原因吗,还是我错过了什么?

Garbage CollectorPhotoImage中的错误是常见问题,当图像分配给局部变量(在函数中创建的变量)时,它会从内存中删除图像。您必须将图像分配给全局变量或某些对象 - 即。到显示图像的标签:

label = Label(...)
label.img = PhotoImage(..)
<小时 />

最少的工作实例

from tkinter import *
def main(root):
global img  # <-- solution for bug 
img = PhotoImage(file="image.png")
Label(image=img).pack()

if __name__ == "__main__":
root = Tk()
main(root)
root.mainloop()

from tkinter import *
def main(root):
img = PhotoImage(file="image.png")
label = Label(image=img)
label.pack()
label.img = img  # <-- solution for bug 

if __name__ == "__main__":
root = Tk()
main(root)
root.mainloop()

不久前,您可以在 effbot.orgtkinter流行文档中找到此信息,但现在该文档消失了。


我在 2020.11.12 的 Wayback Machine 中找到了旧effbot.org:照片图像

最新更新