ImageTK не рендеринг изображения - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь сделать сетку 5х5 случайно сгенерированных изображений.Когда я запускаю следующий код, окно всплывает в правильном размере, но ни одно из изображений, которые должны были быть в метках:

col = 0
for array in (a,b,c,d,e):
    ro = 0
    for item in array:
        if item == 0:
            path = "W.jpg"
        elif item == 1:
            path = "P.jpg"
        elif item == 2:
            path = "D.jpg"
        elif item == 3:
            path = "H.jpg"
        elif item == 4:
            path = "M.jpg"
        elif item == 5:
            path = "F.jpg"
        img = ImageTk.PhotoImage(Image.open(path))
        Label(window, image = img).grid(column = ro, row = col)
        ro += 1
    col += 1
print(final)

1 Ответ

0 голосов
/ 04 марта 2019

Поскольку img будет перезаписано новым экземпляром ImageTk.PhotoImage(...) в цикле for, поэтому предыдущая ссылка img будет потеряна, а предыдущее изображение будет уничтожено.Чтобы преодолеть это, объявите глобальный список для хранения ссылки на изображение, как показано ниже:

imagefiles = ['W.jpg', 'P.jpg', 'D.jpg', 'H.jpg', 'M.jpg', 'F.jpg']
images = [] # list to hold the image references
for col, array in enumerate((a, b, c, d, e)):
    for ro, item in enumerate(array):
        images.append(ImageTk.PhotoImage(Image.open(imagefiles[item]))) # save the image reference
        Label(window, image=images[-1]).grid(row=col, column=ro)

Или вы можете прикрепить ссылку на изображение к экземпляру Label, как показано ниже:

imagefiles = ['W.jpg', 'P.jpg', 'D.jpg', 'H.jpg', 'M.jpg', 'F.jpg']
for col, array in enumerate((a, b, c, d, e)):
    for ro, item in enumerate(array):
        lbl = Label(window)
        lbl.grid(row=col, column=ro)
        lbl.image = ImageTk.PhotoImage(Image.open(imagefiles[item])) # attach the image reference to label instance variable
        lbl.config(image=lbl.image)
...