You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:36:03