Tkinter出现TypeError:期望路径对象而非TextIOWrapper
问题:Tkinter保存文件代码报错TypeError
我运行一段Tkinter示例代码时出现错误,代码如下:
def save_as(): global fo fo = asksaveasfile(initialfile = 'Untitled.txt', defaultextension=".txt",filetypes=[("All Files","*.*"),("Text Documents","*.txt"),("Word files",".docx")]) print(os.path.basename(fo).split('/')[-1]) def sample(): btn = Button(root, text='click', command=save_as) btn.pack() root = tk.Tk() sample() root.mainloop()
出现的错误信息:
Exception in Tkinter callback Traceback (most recent call last): File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\tkinter\__init__.py", line 1921, in __call__ return self.func(*args) File "c:\Users\DELL\Desktop\Ismail\test.py", line 9, in save_as print(os.path.basename(fo).split('/')[-1]) File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\ntpath.py", line 242, in basename return split(p)[1] File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\ntpath.py", line 211, in split p = os.fspath(p) TypeError: expected str, bytes or os.PathLike object, not TextIOWrapper
解决方法
错误原因
asksaveasfile函数返回的是文件IO对象(TextIOWrapper),不是文件路径字符串,而os.path.basename需要传入路径字符串,因此触发类型错误。
方案1:改用asksaveasfilename获取路径
如果仅需获取用户选择的文件路径,直接用asksaveasfilename即可,它会返回路径字符串:
import tkinter as tk from tkinter.filedialog import asksaveasfilename import os def save_as(): file_path = asksaveasfilename(initialfile='Untitled.txt', defaultextension=".txt", filetypes=[("All Files","*.*"),("Text Documents","*.txt"),("Word files",".docx")]) if file_path: # 防止用户取消选择 print(os.path.basename(file_path)) # 直接提取文件名 def sample(): btn = tk.Button(root, text='click', command=save_as) btn.pack() root = tk.Tk() sample() root.mainloop()
方案2:从asksaveasfile的文件对象中获取路径
如果需要保留文件对象用于后续写入操作,可以通过文件对象的name属性获取路径:
import tkinter as tk from tkinter.filedialog import asksaveasfile import os def save_as(): global fo fo = asksaveasfile(initialfile='Untitled.txt', defaultextension=".txt", filetypes=[("All Files","*.*"),("Text Documents","*.txt"),("Word files",".docx")]) if fo: # 防止用户取消选择 print(os.path.basename(fo.name)) # 通过fo.name获取路径 def sample(): btn = tk.Button(root, text='click', command=save_as) btn.pack() root = tk.Tk() sample() root.mainloop()
另外注意:Windows系统的路径分隔符是\,os.path.basename已经能跨平台提取文件名,无需再用split('/'),这个写法在Windows下会出错。
内容的提问来源于stack exchange,提问作者ismail
相关产品推荐
相关产品推荐

