开发PDF阅读器遇报错:expected str, bytes or os.PathLike object, not TextIOWrapper
解决PDF阅读器报错:expected str, bytes or os.PathLike object, not TextIOWrapper
错误原因
askopenfile()调用后返回的是已打开的文件对象(TextIOWrapper),而你后续又用open(book, 'rb')试图再次打开这个对象,open()函数需要的是文件路径字符串,不是已打开的文件对象,这就导致了类型不匹配的错误。- 代码还存在其他逻辑问题:初始化阶段就执行文件选择操作,按钮触发的函数重复执行无效操作,文本提取逻辑提前在全局执行,语音朗读目标错误等。
修复后的完整代码
import PyPDF2 import pyttsx3 from tkinter import * from tkinter.filedialog import askopenfilename # 改用askopenfilename获取文件路径 root = Tk() root.geometry('800x600') root.title("PDF Reader") # 全局变量存储提取的文本 extracted_text = "" def read_pdf(): global extracted_text # 获取文件路径字符串,限定仅选择PDF文件 book_path = askopenfilename(filetypes=[("PDF Files", "*.pdf")]) if not book_path: return # 用户取消选择文件时直接返回 # 用with语句管理文件,自动处理关闭 with open(book_path, 'rb') as pdfobj: pfreader = PyPDF2.PdfReader(pdfobj) extracted_text = "" # 遍历所有页面提取文本 for page in pfreader.pages: page_text = page.extract_text() if page_text: # 跳过空页面 extracted_text += page_text # 更新标签显示,长文本截断避免界面溢出 display_text = extracted_text[:500] + "..." if len(extracted_text) > 500 else extracted_text l1.config(text=display_text) def say_pdf(): if not extracted_text: return # 无文本时不执行朗读 engine = pyttsx3.init() engine.say(extracted_text) engine.runAndWait() # 必须调用此方法才能播放语音 # 初始化标签,设置自动换行 l1 = Label(root, text="请先选择PDF文件", height=12, wraplength=500) l1.grid(row=0, column=0, padx=10, pady=10) choose_file = Button(root, text='选择文件', command=read_pdf) choose_file.grid(row=0, column=1, padx=10, pady=10) read_file = Button(root, text='朗读', command=say_pdf) read_file.grid(row=0, column=2, padx=10, pady=10) root.mainloop()
关键修复点说明
- 替换
askopenfile()为askopenfilename():返回文件路径字符串,符合open()函数的参数要求。 - 用
with语句管理文件:自动关闭文件,避免资源泄漏。 - 调整文本提取时机:将提取逻辑放入
read_pdf函数,确保用户选择文件后才执行。 - 修复语音逻辑:朗读提取到的文本内容,添加
runAndWait()确保语音正常播放。 - 增加异常判断:处理用户取消选择、无文本提取的情况,避免程序报错。
- 优化界面显示:设置标签自动换行,长文本截断显示,提升界面可读性。
内容的提问来源于stack exchange,提问作者Diduah
相关产品推荐
相关产品推荐

