Tkinter文本框含Ğ、ğ、Ş、ş等字符写入文件时出现字符编码错误问题
问题原因
报错核心是filedialog.asksaveasfile()方法在Windows系统下默认使用系统默认编码(此处为cp1252西欧编码)打开文件,而Ğ、ğ、Ş、ş这类字符不在cp1252的编码映射表中,因此写入时触发UnicodeEncodeError。你代码里单独用open()写固定文件file_text.txt时指定了encoding='utf-8'所以这步不会报错,报错是在写入asksaveasfile()返回的文件对象时触发的。
解决方法
方案1(全Python3版本兼容,推荐)
改用asksaveasfilename()获取用户选择的文件路径,手动调用open()时指定utf-8编码,适配性更强:
# 修正后的save_file代码 from tkinter import filedialog from tkinter import END def save_file(): # 先获取用户选择的保存路径,不直接打开文件 file_path = filedialog.asksaveasfilename( defaultextension='.txt', filetypes=[ ("Text File","*.txt"), ("HTML File", "*.html"), ("DOC File", "*.doc"), ("All Files", "*.*") ] ) # 用户点取消就直接返回 if not file_path: return file_text = text_box.get('1.0', END) # 如果你不需要额外生成固定名的file_text.txt,可以删掉下面这段with open逻辑 with open("file_text.txt", mode='w', encoding='utf-8') as outFile: outFile.write(file_text) # 手动打开用户选择的路径,指定utf-8编码写入 with open(file_path, mode='w', encoding='utf-8') as user_file: user_file.write(file_text) # end save as file
方案2(仅Python3.10及以上版本可用)
直接给asksaveasfile添加encoding参数,不用调整整体逻辑:
def save_file(): # 直接指定encoding=utf-8打开文件 file = filedialog.asksaveasfile( defaultextension='.txt', filetypes=[("Text File","*.txt"),("HTML File", "*.html"), ("DOC File", "*.doc"),("All Files", "*.*")], encoding='utf-8' ) if file is None: return file_text = text_box.get('1.0', END) with open("file_text.txt", mode='w', encoding='utf-8') as outFile: outFile.write(file_text) file.write(file_text) file.close()
补充说明
你当前的代码会同时生成两个文件:一个是固定名称的file_text.txt,另一个是用户选择路径的自定义名称文件,如果不需要固定名的重复文件,可以删除对应with open("file_text.txt"...的逻辑。
内容的提问来源于stack exchange,提问作者MMA
相关产品推荐
相关产品推荐

