В Tkinter нам иногда приходится создавать ссылку на преобразованное изображение (например), чтобы оно не было уничтожено при выходе из области видимости.
Обычный способ - добавить переменнуюк его экземпляру виджета. Примером этого является:
bard = Image.open("bardejov.jpg")
bardejov = ImageTk.PhotoImage(bard)
label1 = Label(self, image=bardejov)
label1.image = bardejov #<<<<<<<<<<<<<<<<<<<<<
label1.place(x=20, y=20)
Это часть примера, опубликованного Яном Боднаром из Zetcode, с моей пометкой этого примера. bardejov - это локальная переменная в функции, и если вы закомментируете отмеченную строку, вы не получите изображение, потому что оно уничтожается, когда функция возвращается, а метка просто видит «none».
IЯ новичок в Tkinter, и это меня скорее беспокоило, добавив новые свойства в системный код, и кто-то предложил это:
class S():
# To make an object 'accessible', and thus save
# it from garbage collection.
fred = []
@classmethod
def save(cls, x):
cls.fred.append(x)
Это, безусловно, сработало в примере Яна:
bard = Image.open("xxxx.jpg")
bardejov = ImageTk.PhotoImage(bard)
label1 = Label(self, image=bardejov)
#label1.image = bardejov
S.save(bardejov)
НоЭто нормально? Есть ли нежелательные побочные эффекты?