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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:12:06