UnicodeDecodeError:“ charmap”编解码器无法解码字节0x81。如何应对

时间:2019-11-22 17:24:59

标签: python user-interface

即使给出“ encoding ='utf-8'”,甚至给出“ errors ='ignore'”。我遇到同样的错误。

def open():
    global My_Image
    root.filename = filedialog.askopenfile(initialdir = '/Users/GAURAV/Desktop', title = "Select an Image file.", filetypes = (("JPG files", "*.jpg"), ("All files", "*.*")))
    my_label = Label(root, text = root.filename).pack()
    My_Image = ImageTk.PhotoImage(Image.open(root.filename))          #over here
    My_Image_Label = Label(image = My_Image).pack()

1 个答案:

答案 0 :(得分:0)

tkinter具有两个功能askopenfile(您使用)和askopenfilename

第二个函数(askopenfilename)给出带有文件名的字符串。

但是第一个函数(askopenfile)以文本模式打开文件,并且可以访问此打开的文件,而不是文件名。

如果您使用print(type(root.filename)),则会看到<class '_io.TextIOWrapper'>而不是<class 'str'>

这会带来问题-要读取图像,您需要字节模式,而不是文本模式。

因此,最好使用askopenfilename来获取文件名,而Image.open()将以字节模式将其打开并正确读取。


编辑:最终,您可以在mode="rb"中使用askopenfile来以字节模式打开文件

root.filename = tkinter.filedialog.askopenfile(mode='rb', initialdir=..., ...)

print(typo(root.filename))将显示<class '_io.BufferedReader'>,它也应与Image.open()一起使用


顺便说一句::当您使用askopenfile时,会打开文件,文件名在root.filename.name