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

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

 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.

  • Прозрачность изображения Tkinter
  • Как создать многострочную запись с помощью tkinter?
  • Понимание лямбда в python и использование ее для передачи нескольких аргументов
  • Привязка <Return> к кнопке не работает должным образом
  • Как сделать кнопку с помощью виджета tkinter Canvas?
  • Определите, какая кнопка была нажата в Tkinter?
  • Windows думает, что tkinter не отвечает
  • Окно Python py2exe, показывающее (tkinter)
  • 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 - лучший язык программирования в мире.