Почему изображение не появляется? Python

from tkinter import *
from PIL import ImageTk, Image


def ha(root):
    img = ImageTk.PhotoImage(Image.open("256.jpg"))
    panel = Label(root, image=img)
    panel.grid(column=0, row=1)


root = Tk()
ha(root)
root.mainloop()

Что вижу

Что хочу увидеть

Я думаю тут проблема в том, что переменная img удаляется сборщиком мусора. Как это можно разрешить?


Ответы (2 шт):

Автор решения: S. Nick

Попробуйте так:

from tkinter import *
from PIL import ImageTk, Image


def ha(img):
#    img = ImageTk.PhotoImage(Image.open("im.png"))          # ---
    panel = Label(root, image=img)
    panel.grid(column=0, row=1)


root = Tk()
img = ImageTk.PhotoImage(Image.open("im.png"))                # +++
ha(img)
root.mainloop()

Update

или так

from tkinter import *
from PIL import ImageTk, Image                  # pip install pillow


class MainWindow():
    def __init__(self, root):
        self.root = root
        self.root.resizable(True, True)         # (False, False)   
        self.root.protocol("WM_DELETE_WINDOW")
        self.root.iconbitmap("music.ico")
        self.root.title("Tkinter - ImageTk")

        self.ha()

    def ha(self):
        self.image = ImageTk.PhotoImage(Image.open("im.png"))       
        self.panel = Label(self.root, image=self.image)
        self.panel.grid(column=0, row=1)    


if __name__ == '__main__':
    root = Tk()
    w = MainWindow(root)
    root.mainloop()

введите сюда описание изображения

→ Ссылка
Автор решения: llollcat
from tkinter import *
from PIL import ImageTk, Image

global img  # +++


def ha():
    global img  # +++
    img = ImageTk.PhotoImage(Image.open("256.jpg"))  
    panel = Label(root, image=img)
    panel.grid(column=0, row=1)


root = Tk()           
ha()
root.mainloop()

Таким образом сборщик не удалит переменную, и я смогу использовать свою колхозную функцию.

→ Ссылка