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
相关产品推荐
相关产品推荐

