tkinter не может добавить фотографию в класс, которая не включает mainluop

Я не знаком с python и специально с проблемами с GUI. Я пытаюсь добавить изображение из другого класса, я нашел способ добавить другой объект, но не изображения. Этот код работает нормально:

from Tkinter import * from PIL import Image, ImageTk class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.parent = master self.initUI() def initUI(self): self.outputBox = Text(self.parent, bg='black', height= 10, fg='green', relief=SUNKEN, yscrollcommand='TRUE') self.outputBox.pack(fill='both', expand=True) def main(): root = Tk() app = Application(root) app.parent.geometry('800x500') app.parent.configure(background = 'red') path = "../img/Stalin.jpeg" img = ImageTk.PhotoImage(Image.open(path)) panel = Label(app.parent, image = img) panel.pack(side = "bottom", fill = "both", expand = "yes") app.mainloop() main() 

Но когда я пытаюсь добавить изображение из класса, он открывает окно, но без изображения:

  • Обработка изображения из blob GAE
  • Отображение изображений Python
  • Храните jpg, gif, png и т. Д. Gae-datastore
  • Любой быстрый графический интерфейс Python для отображения прямых изображений с камеры
  • Нет модуля с именем Image
  • Вернуть изображение в браузер в python, cgi-bin
  •  from Tkinter import * from PIL import Image, ImageTk class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.parent = master self.initUI() def initUI(self): self.outputBox = Text(self.parent, bg='black', height= 10, fg='green', relief=SUNKEN, yscrollcommand='TRUE') self.outputBox.pack(fill='both', expand=True) path = "../img/Stalin.jpeg" img = ImageTk.PhotoImage(Image.open(path)) panel = Label(self.parent, image = img) panel.pack(side = "bottom", fill = "both", expand = "yes") def main(): root = Tk() app = Application(root) app.parent.geometry('800x500') app.parent.configure(background = 'red') app.mainloop() main() 

    работая с python 2.7 на eclipse.

  • Насколько эффективна потоковая обработка в Python?
  • Интерполяция данных из таблицы поиска
  • Django - Как выполнить распаковку кортежа в цикле шаблона 'for'
  • Запуск модуля из консоли pycharm
  • Предложения для инструментов отладки Python?
  • Удаление элемента из списка на основе предиката
  • One Solution collect form web for “tkinter не может добавить фотографию в класс, которая не включает mainluop”

    Как указано здесь –

    Вы можете использовать ярлык для отображения объектов PhotoImage и BitmapImage. При этом убедитесь, что вы храните ссылку на объект изображения, чтобы предотвратить его сбор мусора, собранный распределителем памяти Python. Вы можете использовать глобальную переменную или атрибут экземпляра.

    (Акцент мой)

    Но во втором примере объект изображения img является локальной переменной в initUI() , поэтому, когда метод заканчивается, изображение получает сбор мусора (особенно в CPython, поскольку он использует подсчет ссылок). Вы должны сохранить изображение как атрибут экземпляра –

     def initUI(self): self.outputBox = Text(self.parent, bg='black', height= 10, fg='green', relief=SUNKEN, yscrollcommand='TRUE') self.outputBox.pack(fill='both', expand=True) path = "../img/Stalin.jpeg" self.img = ImageTk.PhotoImage(Image.open(path)) panel = Label(self.parent, image = self.img) panel.pack(side = "bottom", fill = "both", expand = "yes") 

    Он работает в вашем первом случае, потому что вы вводите mainloop из метода main() , поэтому метод main() не заканчивается до окончания mainloop() , и, следовательно, изображение не получает мусор, собранный до тех пор, пока приложение не завершит работу.

    Python - лучший язык программирования в мире.