Почему мне нужно два раза определять изображение метки?

#python #python-3.x #tkinter #python-imaging-library

Вопрос:

Я смотрел этот учебник о том, как сделать pdf_reader:

https://www.youtube.com/watch?v=itRLRfuL_PQamp;t=101s

В 7.26 она набирает эту строку кода:

 logo_label.image = logo
 

Мне просто было интересно, почему, как она говорит, эта строка кода «абсолютно необходима», даже если программа работает без нее.

Вот та часть кода, о которой я говорю:

 import tkinter as tk
from PIL import ImageTk,Image

logo = Image.open("tkinterResources/logo.png")
logo = ImageTk.PhotoImage(logo)
logo_label = tk.Label(image=logo)
logo_label.image = logo
logo_label.grid(row=0, column=1)
 

Комментарии:

1. Это как-то связано со сборщиком мусора python. Следовательно, вам нужно (явно) создать его снова. Для лучшего понимания, проверьте это

Ответ №1:

Спасибо @FrainBr33z3 за ответ, его можно найти по этой ссылке.

В случае, если сайт исчезнет, я вставляю его содержимое ниже:

Когда вы добавляете фотоизображение или другой объект изображения в виджет Tkinter, вы должны сохранить свою собственную ссылку на объект изображения. Если вы этого не сделаете, изображение не всегда будет отображаться. Проблема в том, что интерфейс Tkinter/Tk неправильно обрабатывает ссылки на объекты изображений; виджет Tk будет содержать ссылку на внутренний объект, но Tkinter этого не делает. Когда сборщик мусора Python удаляет объект Tkinter, Tkinter сообщает Tk освободить изображение. Но поскольку изображение используется виджетом, Tk не уничтожает его. Не совсем. Он просто закрывает изображение, делая его полностью прозрачным… Решение заключается в том, чтобы убедиться, что ссылка на объект Tkinter сохранена, например, прикрепив ее к атрибуту виджета:

 photo = PhotoImage(...)

label = Label(image=photo)
label.image = photo # keep a reference!
label.pack()