Проблема не в синтаксисе , а в сборке мусора .В сокращенном виде:
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()
Но вы можете видеть, что мы далеко отошли от однострочника!