Python 2.7.16程序保存图片后打开报错‘文件未找到’的问题排查
问题分析与修复方案
咱们来拆解下你遇到的问题,核心有两个关键点:
1. Tkinter Label 加载图片的方式完全错误
你直接把文件路径字符串传给label.configure(image="..."),但Tkinter的Label组件的image参数不接受纯路径字符串——它需要的是Tkinter兼容的图像对象。而且Tkinter原生不支持JPG格式,得借助PIL的ImageTk模块来做格式转换。
2. 潜在的文件保存隐患(容易导致“文件未找到”)
虽然你的get_img()函数里调用了img1.save(),但如果程序没有目标路径的写入权限、或者路径拼写错误,保存操作会静默失败(你没加异常捕获),这也会导致后续找不到文件。
修复后的完整代码
from tkinter import * from PIL import Image as PIM from PIL import ImageTk # 新增:导入ImageTk用于转换图像为Tkinter兼容格式 from tkinter.filedialog import askopenfilename # 创建窗口 win = Tk() win.geometry("1000x900+50+50") win.title("Display Images") # 选择并保存jpg图片的函数 def get_img(): imgin = askopenfilename(initialdir='/home/pi/Python', title='Choose Image File', filetypes=[('Image files', '.jpg')]) if imgin: try: # 新增:异常捕获,排查保存失败的问题 img1 = PIM.open(imgin) save_path = "/home/pi/Python/thumb1.jpg" img1.save(save_path) img1.close() return save_path # 返回保存的路径,方便后续加载 except Exception as e: print(f"保存图片失败:{str(e)}") return None return None # 创建用于显示图片的Label组件 label = Label(win) label.grid(row=0, column=0, columnspan=2) # 执行图片选择与保存,然后加载到Label saved_path = get_img() if saved_path: # 用PIL打开保存后的图片,转换为Tkinter兼容的PhotoImage对象 img_display = PIM.open(saved_path) # 可选:调整图片大小适配窗口,比如缩放到800x600 img_display = img_display.resize((800, 600), PIM.ANTIALIAS) tk_img = ImageTk.PhotoImage(img_display) # 注意:必须保留tk_img的引用,否则会被垃圾回收,图片显示不出来 label.tk_img = tk_img label.configure(image=tk_img) win.mainloop()
关键修复点说明
- 新增
ImageTk导入:将PIL的Image对象转换为Tkinter能识别的PhotoImage对象,解决JPG格式不兼容问题。 - 保留图像对象引用:把
tk_img赋值给label.tk_img,防止Python的垃圾回收机制把图像对象销毁,导致Label显示空白。 - 添加异常捕获:在保存图片时加入
try-except,方便排查权限不足、路径错误等保存失败的问题。 - 正确传递图像对象:给
label.configure(image=...)传入的是转换后的tk_img对象,而不是路径字符串。
内容的提问来源于stack exchange,提问作者Alan White




