运行tkinter PDF转音频代码报bad window path name错误求助
错误根因
- 核心问题是
ebook函数内创建的两个按钮没有指定父组件:你创建brows_pdf、audio_button按钮时没有传master参数,tkinter默认会把组件绑定到程序第一个创建的Tk实例也就是主窗口root上,但你后续调用canvas1.create_window要把这两个属于root的组件挂载到属于子窗口book的画布上,跨Tk实例的组件操作不被tkinter支持,就会触发窗口路径无效的错误。 - 额外不规范用法:tkinter程序禁止同时创建多个
Tk实例,每个Tk对应独立的tcl解释器,资源互不互通,新开子窗口应该用Toplevel类实现,也不需要给子窗口单独加mainloop。
修复步骤
- 把
ebook函数里book = tk.Tk()替换为book = tk.Toplevel(),删除函数末尾的book.mainloop() - 给两个按钮的创建代码加上
master=book参数,指定父组件为子窗口book
修改后的核心代码段
def ebook(): import tkinter as tk from tkinter import filedialog from tkinter import messagebox from gtts import gTTS import pdfplumber # 用Toplevel创建子窗口,不要用第二个Tk book = tk.Toplevel() book.minsize(width=150, height=200) book.maxsize(width=300, height=420) canvas1 = tk.Canvas(book, width=300, height=420, bg='azure3', relief='raised') canvas1.grid() label1 = tk.Label(book, text="PDF Audio Store", bg='azure3') label1.config(font=('helvetica', 16)) canvas1.create_window(150, 20, window=label1) final = "" def get_pdf(): global final global pdf_checker try: import_file_path = filedialog.askopenfilename() if (str(import_file_path).endswith(".pdf")): pdf = pdfplumber.open(import_file_path) pdf_checker = pdf n = len(pdf.pages) for page in range(n): data = pdf.pages[page].extract_text() final = final + "\n" + data messagebox.showinfo("Information", "PDF is imported") else: raise Exception("Provide .pdf file only") except Exception as e: messagebox.showerror("Error", "{}".format(e)) else: print("Continue to conversion") # 给按钮指定master为book brows_pdf = tk.Button(master=book, text="PDF entry", command=get_pdf, bg='royalblue', fg="white", font=('helvetica', 12, 'bold'), border=0, activebackground="green") canvas1.create_window(150, 60, window=brows_pdf) def convert_audio(): global final global pdf_checker try: print("File Information") print(pdf_checker) export_file_path = filedialog.asksaveasfilename(defaultextension=".mp3") final_file = gTTS(text=final, lang="en") final_file.save(export_file_path) messagebox.showinfo("Information", "Audio file generated") except NameError: messagebox.showwarning("Warning", "Import PDF first") # 给按钮指定master为book audio_button = tk.Button(master=book, text="Convert to Audio", command=convert_audio, bg='royalblue', fg="white", font=('helvetica', 12, 'bold'), border=0, activebackground="green") canvas1.create_window(150, 100, window=audio_button)
内容的提问来源于stack exchange,提问作者user16806547
相关产品推荐
相关产品推荐

