如何在 Tkinter 中将目录中的图像显示为标签?

How to display images from a directory as labels in Tkinter?

我是使用 Tkinter 的 Python GUI 新手,我遇到以下问题:

我正在尝试使用 Python 的 os 模块读取特定目录中的一些图像文件,并在单个 window 中将它们显示为 Tkinter 的标签。这些图像的平均大小为 1990 x 1200。因此,我使用 Pillow 库调整了它们的大小,然后使用 for 循环将每个图像打包到 window。

但是它没有显示图像,而是显示空白 window。我写了下面的代码:

from PIL import Image, ImageTk
import tkinter as tk
import os

root = tk.Tk()
root.title("Photo Gallery")
root.geometry("655x350")

for (root_, dirs, files) in os.walk("Wallpaper"):
    if files:
        for file_ in files:
            path = os.path.join("Wallpaper", file_)
            image_ = Image.open(path)
            n_image = image_.resize((100, 100))
            photo = ImageTk.PhotoImage(n_image)
            img_label = tk.Label(root, image=photo)
            img_label.pack()


root.mainloop()

这是空白的截图window:

注:我使用Python3.6.3和Pillow 8.2.0。

编辑: 结合 acw1668 评论中的提示(感谢!),修复会更容易:

for (root_, dirs, files) in os.walk("path/to/your/images"):
    if files:
        for file_ in files:
            path = os.path.join("path/to/your/images", file_)
            image_ = Image.open(path)
            n_image = image_.resize((100, 100))
            photo = ImageTk.PhotoImage(n_image)
            img_label = tk.Label(root, image=photo)
            img_label.photo = photo                             # <--
            img_label.pack()

我想这是一个关于图像垃圾收集的问题,cf。 。简单地保留对单个 photo 变量的一些引用对我来说就成功了:

references = []                                                 # <--
for (root_, dirs, files) in os.walk("path/to/your/images"):
    if files:
        for file_ in files:
            path = os.path.join("path/to/your/images", file_)
            image_ = Image.open(path)
            n_image = image_.resize((100, 100))
            photo = ImageTk.PhotoImage(n_image)
            img_label = tk.Label(root, image=photo)
            img_label.pack()
            references.append(photo)                            # <--

这是一些输出:

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.16299-SP0
Python:        3.9.1
PyCharm:       2021.1
Pillow:        8.2.0
----------------------------------------