import os import tkinter as tk from PIL import Image, ImageTk, ImageDraw, ImageFont import threading import time def load_images_from_folder(folder): """从指定文件夹加载图像文件,并按文件前的数字排序.""" images = [] for filename in sorted(os.listdir(folder), key=lambda x: float(x[:-4]), reverse=True): if filename.endswith(('.png', '.jpg', '.jpeg')): # 只处理图像文件 img_path = os.path.join(folder, filename) images.append((img_path, filename[:-4])) # 返回图像路径及文件名(去掉扩展名) return images def create_image_viewer(folder_path): """创建图像查看器并展示指定文件夹中的图像, 返回刷新函数.""" def show_images(): """显示前五张图像于标签中.""" for i, (image_path, filename) in enumerate(images[:8]): img = Image.open(image_path).convert("RGBA") img = img.resize((200, 200), Image.Resampling.LANCZOS) # 调整图像大小,使用 LANCZOS # 在图像上添加文本 draw = ImageDraw.Draw(img) font = ImageFont.load_default() # 使用默认字体 text_position = (10, 10) # 文本位置 try: font = ImageFont.truetype("arial.ttf", 30) # 加载自定义字体并设置大小 except IOError: font = ImageFont.load_default() # 如果无法加载自定义字体则使用默认字体 draw.text(text_position, f"{filename} M", fill="red",font=font) # 添加文本 img = ImageTk.PhotoImage(img) # 计算位置并创建标签显示图像 image_label = tk.Label(root, image=img) image_label.image = img # type: ignore # 保持对图像的引用 image_label.grid(row=i//2, column=i%2) # 放置在一列中,垂直排列 def refresh_images(): """刷新图像列表.""" nonlocal images images = load_images_from_folder(folder_path) # 重新加载图像 for widget in root.grid_slaves(): # 清除之前的图像标签 widget.destroy() show_images() # 显示新图像 def auto_refresh(): """每五秒自动刷新图像.""" while True: refresh_images() time.sleep(10) # 创建Tkinter窗口 root = tk.Tk() root.title("Display Faces Images") # 加载图像 images = load_images_from_folder(folder_path) # 显示图像 show_images() # 启动自动刷新线程 refresh_thread = threading.Thread(target=auto_refresh, daemon=True) refresh_thread.start() # 启动程序 root.after(0, lambda: root.focus_force()) # 确保窗口获得焦点 root.mainloop() # 使用示例: if not os.path.exists("faces"): os.makedirs("faces") folder_path = "faces" # 图像文件夹路径 create_image_viewer(folder_path)