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

Python通过Tkinter文件对话框打开图片报UnicodeDecodeError如何解决

错误修复方案

根本原因

filedialog.askopenfile()方法默认返回文本只读模式的文件对象,读取PNG、JPG这类二进制格式的图片文件时,Python会默认用UTF-8解码二进制内容,第一个字节0x89不属于UTF-8可解码范围,因此触发UnicodeDecodeError报错。

修复方法

方案1(推荐):改用返回文件路径的接口

将filedialog.askopenfile替换为filedialog.askopenfilename,该接口直接返回选中文件的绝对路径字符串,完美适配Image.open()的入参要求,同时额外增加非空判断避免用户点击取消按钮时报错。
修改后完整代码如下:

from tkinter import *
from tkinter import filedialog
from PIL import ImageTk, Image

root = Tk()
root.title("Title")
# 替换方法为askopenfilename
root.filename = filedialog.askopenfilename(initialdir = "/Users/karan/Downloads", 
                                       title = "Select a file",
                                       filetypes=(("png files","*.png"),("jpeg files","*.jpeg")))

# 增加非空判断,避免用户未选文件时报错
if root.filename:
    my_label = Label(root, text= root.filename)
    my_label.pack()
    my_image = ImageTk.PhotoImage(Image.open(root.filename))
    my_image_label = Label(image = my_image)
    my_image_label.pack()

root.mainloop() 

方案2:保持原接口,指定二进制打开模式

如果需要直接获取文件对象,调用askopenfile时增加mode='rb'参数,指定以二进制只读模式打开文件即可:

root.filename = filedialog.askopenfile(initialdir = "/Users/karan/Downloads", 
                                       title = "Select a file",
                                       filetypes=(("png files","*.png"),("jpeg files","*.jpeg")),
                                       mode="rb") # 新增二进制打开参数

使用该方案时注意,文件对象使用完成后需调用root.filename.close()手动释放资源。

内容的提问来源于stack exchange,提问作者SpaceTesla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:42:03