使用filedialog.asksaveasfile保存文件时遇AttributeError错误求助
问题分析与解决
错误原因
你在调用filedialog.asksaveasfile获取到文件对象后,执行了sf=u'<'这行代码,直接把文件对象覆盖成了字符串,后续调用sf.write()时,字符串类型当然没有write方法,这就是报错的根源。另外sf.encode('utf8')这行完全多余,既没有修改原变量,也和文件操作无关。
修正后的代码
def SaveFile(): sf = filedialog.asksaveasfile(defaultextension=".txt", mode='w', encoding='utf-8', # 加上编码参数,避免乱码 filetypes=[ ("Text file", ".txt"), ("HTML file", ".html"), ("All files", ".*"), ]) if sf is None: # 先判断用户是否取消了保存操作 return sf.write('\n'.join(listbox2.get(0, END))) sf.close()
关键说明
- 移除
sf=u'<'和sf.encode('utf8')这两行无效且破坏逻辑的代码。 - 在
asksaveasfile中添加encoding='utf-8'参数,和你固定文件名的代码保持一致,避免中文乱码问题。 - 先判断
sf is None(用户取消保存时返回None),再执行写入操作,逻辑更严谨。
另外,也可以用asksaveasfilename先获取路径,再用with open的方式写入,和你熟悉的固定文件名写法更接近:
def SaveFile(): file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[ ("Text file", ".txt"), ("HTML file", ".html"), ("All files", ".*"), ]) if not file_path: # 用户取消则返回 return with open(file_path, "w", encoding="utf-8") as file: file.write('\n'.join(listbox2.get(0, END)))
这种方式更直观,也不需要手动关闭文件,with块会自动处理。
内容的提问来源于stack exchange,提问作者spike666spike666
相关产品推荐
相关产品推荐

