Python使用asksaveasfile保存self.billdata时文件无写入内容如何解决
问题根源
asksaveasfile() 的返回值不是文件路径字符串,而是已经按指定模式打开的文件对象。你将该文件对象作为路径参数传入open()属于参数类型错误,会导致写入逻辑异常,最终目标文件没有任何内容。另外代码未处理用户点击保存对话框「取消」按钮的场景,此时返回值为None,直接执行后续逻辑还会触发程序崩溃。
修复方法
两种实现方式都可以正常完成保存逻辑,按需选择即可:
方法一:直接使用asksaveasfile返回的文件对象写入
不需要额外调用open(),拿到返回的文件对象后直接写入数据即可,记得增加空值判断处理用户取消的场景:
def save_bill(self): self.billdata = self.txtarea.get('1.0', END) files = [('All Files', '*.*'), ('Python Files', '*.py'), ('Text Document', '*.txt')] file = asksaveasfile(filetypes = files, defaultextension = ".txt", mode='w') # 用户点击取消时直接退出函数 if not file: return file.write(self.billdata) file.close()
方法二:获取文件路径后自行管理文件读写
如果需要自定义文件打开参数(比如指定编码),可以换用asksaveasfilename()获取用户选择的文件路径字符串,再自行打开文件写入:
def save_bill(self): self.billdata = self.txtarea.get('1.0', END) files = [('All Files', '*.*'), ('Python Files', '*.py'), ('Text Document', '*.txt')] file_path = asksaveasfilename(filetypes = files, defaultextension = ".txt") if not file_path: return # 用with上下文管理器自动处理文件关闭,指定utf-8编码避免中文乱码 with open(file_path, 'w', encoding='utf-8') as f: f.write(self.billdata)
优先推荐第二种写法,
with语句会在写入完成或出现异常时自动关闭文件,避免文件资源泄漏,指定编码也能解决不同系统下打开文件乱码的问题。
内容的提问来源于stack exchange,提问作者Jithendra Reddy
相关产品推荐
相关产品推荐

