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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:03:23