0

我是使用 Tkinter 的 Python GUI 的新手,我坚持以下几点:

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

但不是显示图像,而是显示一个空白窗口。我写了以下代码:

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

这是空白窗口的屏幕截图:

空白窗口的图像。

注意:我使用 Python 3.6.3 和 Pillow 8.2.0。

4

1 回答 1

1

编辑:结合 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()

我想这是关于图像垃圾收集的问题,参见。这个问答。简单地保留对单个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
----------------------------------------

于 2021-04-16T11:59:14.753 回答