root = tkinter.Tk() test = Test(root) root.mainloop()
Переведено автоматически
Ответ 1
Переменная photo является локальной переменной, которая собирает мусор после создания экземпляра класса. Решение включает сохранение ссылки на фотографию, например:
self.photo = tkinter.PhotoImage(...)
Если вы выполните поиск в Google по запросу "изображение tkinter не отображается", первый результат будет таким:
from tkinter import * from PIL import ImageTk, Image
root = Tk()
defopen_img(): global img path = r"C:\.....\\" img = ImageTk.PhotoImage(Image.open(path)) panel = Label(root, image=img) panel.pack(side="bottom", fill="both") but1 = Button(root, text="click to get the image", command=open_img) but1.pack() root.mainloop()
Просто добавьте global в определение img, и это сработает
Ответ 3
Проблема в том, что Python автоматически удаляет ссылки на переменную с помощью процесса, известного как сборка мусора. Решение заключается в сохранении ссылки или создании новой ссылки.
Ниже приведены способы:
Используется self для увеличения количества ссылок и сохранения ссылки.
Как правило, всякий раз, когда вы создаете свое изображение в блоке кода с отступом, вам нужно сохранить ссылку на это изображение. Это из-за автоматической сборки мусора в python, и он собирает все с refcount равным 0, когда уничтожает / оставляет этот фрейм / страницу / блок кода с отступом.
Канонический способ справиться с этим - иметь список изображений где-нибудь в глобальном пространстве имен и добавлять свои ссылки на изображения в этот список. Это удобно, но не очень эффективно, и его следует использовать для небольших приложений.
Более эффективный способ - это привязать атрибут к вашему виджету или классу, который содержит эту ссылку для вас, как предложил Брайан в своем ответе. Не имеет значения, выполняете ли вы self.image или widget.image это было назначено widget = tk.Widget(.. раньше. Но это также может быть неправильным подходом, если вы хотите использовать это изображение дальше, даже когда виджет уничтожен и собран мусор.