下面的示例根本不会显示图像:
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 Collector
PhotoImage
中的错误是常见问题,当图像分配给局部变量(在函数中创建的变量)时,它会从内存中删除图像。您必须将图像分配给全局变量或某些对象 - 即。到显示图像的标签:
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
:照片图像