首页 > 解决方案 > _tkinter.TclError:错误的窗口路径名“.!button2”

问题描述

我正在尝试运行此代码,但它给出了 "_tkinter.TclError: bad window path name ".!button2" " 这个错误。但是,如果我在没有电子书功能的情况下运行相同的代码,它就可以正常工作。由于我是编码新手,因此将不胜感激。

from tkinter import *

root = Tk()
root.title("Application")
root.resizable(width=False, height=False)

mylabel0= Label(root, text="        ")
mylabel0.grid(row=0, column=0)

def ebook():
    import tkinter as tk
    from tkinter import filedialog
    from tkinter import messagebox
    from gtts import gTTS
    import pdfplumber

    book = tk.Tk()
    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")

    brows_pdf = tk.Button(text="PDF entry", command=get_pdf, bg='royalblue', fg="white", font=('helvetica', 12, 'bold'),
                          border=0,
                          activebackground="green")

它在 this() 区域特别是 create_window 中给出错误。错误图像

    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")

    audio_button = tk.Button(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)

    book.mainloop()

button_ebook= Button(root, text="E-Book", font=30, padx=25, pady=25, command=ebook, fg="black", bg="white", borderwidth=1)
button_ebook.grid(row=3, column=2, padx=10)




root.mainloop()

标签: pythonpython-3.xtkinter

解决方案


问题的根源在于您不能在一个窗口中使用另一个窗口的后代按钮。

第一个问题是您正在创建Tk. 在一个实例中创建的按钮在另一个实例中不可用。在这种情况下,您的按钮位于原始实例中,Tk但您的画布位于另一个实例中。

第二个问题类似。即使替换 的第二个实例Tk,该按钮也位于根窗口中,因此不能用作第二个窗口中的画布的子级。

解决方案是Toplevel用于第二个窗口,并确保按钮是第二个窗口和/或画布的后代。


推荐阅读