Ткинтер и библиотека PhotoImage - PullRequest
       26

Ткинтер и библиотека PhotoImage

0 голосов
/ 13 декабря 2018

Этот код работает:

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

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

Почему этот способ не работает?

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

Разве невозможно разместить все в одной строке?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Проблема не в синтаксисе , а в сборке мусора .В сокращенном виде:

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

Но вы можете видеть, что мы далеко отошли от однострочника!

0 голосов
/ 13 декабря 2018

В первой версии img сохраняет ссылку на изображение.

Во второй версии ссылка на это изображение отсутствует, а pack() возвращает None

...