HeadBallGame/show_avatar.py
2025-03-01 10:42:23 +08:00

76 lines
2.8 KiB
Python

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()
# 使用示例:
folder_path = "faces" # 图像文件夹路径
create_image_viewer(folder_path)