如何在 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
----------------------------------------
我是使用 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
----------------------------------------