Tkinter开发幻灯片程序调用ImageTk加载图片触发FileNotFoundError
问题原因与解决方案
错误原因
os.listdir() 仅返回目标目录下的纯文件名,不会携带所属目录的路径前缀。调用Image.open(i)时,Python会默认在当前脚本的运行工作目录下查找该文件,而不是在你选择的folder_path目录下查找,因此找不到对应文件触发FileNotFoundError。
修复方案
核心修复:拼接完整文件路径
使用os.path.join(folder_path, i)将选择的目录路径和文件名拼接为完整的绝对路径,再传入Image.open()即可解决找不到文件的问题。
附加必选修复:解决界面阻塞问题
原代码中使用time.sleep(5)会阻塞Tkinter的事件主循环,导致界面无响应、图片无法正常渲染,需要替换为Tkinter自带的after()方法实现延时切换。
优化建议:兼容大小写后缀
判断文件后缀时统一转为小写,避免.JPG/.PNG这类大写后缀的图片被过滤。
修正后完整代码
import os import tkinter as tk from tkinter import filedialog as fd from PIL import Image, ImageTk # 初始化窗口和画布 root = tk.Tk() canvas = tk.Canvas(root, width=800, height=600) canvas.pack() def show_next_image(img_list, index=0): if index >= len(img_list): # 所有图片播放完成可自行添加后续逻辑 return # 加载当前图片 new_image = Image.open(img_list[index]) # 可按需添加图片缩放逻辑适配画布大小 new_image = ImageTk.PhotoImage(image=new_image) # 保留图片引用避免被GC回收 canvas.image = new_image canvas.create_image(0, 0, image=new_image, anchor=tk.NW) # 5000毫秒即5秒后切换下一张 canvas.after(5000, show_next_image, img_list, index + 1) # 目录选择与图片筛选 folder_path = fd.askdirectory(initialdir=os.getcwd(), title="Open Directory") img_list = [] for filename in os.listdir(folder_path): if filename.lower().endswith((".jpg", ".png", ".jpeg")): full_img_path = os.path.join(folder_path, filename) img_list.append(full_img_path) # 存在符合要求的图片则开始播放 if img_list: show_next_image(img_list) root.mainloop()
内容的提问来源于stack exchange,提问作者Abhimanyu Sharma
相关产品推荐
相关产品推荐

