我第二次使用 ttk 按钮(在 root 中)创建顶层 window,顶层 window 无法被破坏

The second time I use a ttk button (in root) to create a toplevel window, the toplevel window cannot be destroyed

基本上,我在根目录中有一个创建顶层的按钮。然后在 Toplevel 中,我还有一个 ttk.Button,单击它会破坏 Toplevel。我使用的是 .destroy(),而不是 .quit() 或任何其他错误的命令,这很明显,因为我第一次使用我的根按钮创建 Toplevel,我的 Toplevel 按钮将破坏 Toplevel。

但是我第二次点击root按钮重新创建Toplevel(也就是重新创建Toplevel),Toplevel会重新创建成功,但是Toplevel按钮不会破坏Toplevel ,我不明白为什么。这是我的代码(我留下了所有额外的小部件,因为当我不包括它们时,顶层的破坏工作得很好):

from tkinter import *
from tkinter import ttk

class App():
    def __init__(self,root):
        root.title('My Flashcards')
        root.resizable(False,False)

        button_create = ttk.Button(root,text='Create New',command=self.create_new).grid(column=1,row=2)

    def create_new(self):
        self.create_branch = Toplevel()
        self.create_branch.resizable(False,False)
        self.create_branch.title('Create new flashcards')

        ttk.Label(self.create_branch,text='CREATE A NEW FLASHCARD HERE:').grid(column=1,row=1,pady=(10,10),padx=(10,10))
        
        ttk.Label(self.create_branch,text='Type the question:').grid(column=1,row=4,padx=(10,10),pady=(10,10))        
        self.create_question = Entry(self.create_branch,width=70)
        self.create_question.grid(column=1,row=5,padx=(10,10))
        ttk.Label(self.create_branch,text='Type the answer:').grid(column=1,row=6,padx=(10,10),pady=(10,10))        
        self.create_answer = Text(self.create_branch)
        self.create_answer.grid(column=1,row=7,padx=(10,10))
        self.submit_new_flashcard = ttk.Button(self.create_branch,text='Submit',command=self.submit_new_flashcard)
        self.submit_new_flashcard.grid(column=1,row=8,pady=(10,10))

    def submit_new_flashcard(self):
        #Do some things here with self.create_answer.get() and self.create_question.get()
        self.create_branch.destroy()

if __name__ == "__main__":
    root = Tk()
    App(root)
    root.mainloop()

你有一个方法submit_new_flashcard。当您创建按钮并分配 command=self.submit_new_flashcard 时,将创建按钮并将命令 属性 绑定到该方法。然后将 self.submit_new_flashcard 字段指定为创建该按钮的结果。当您销毁按钮时,引用名称仍保留在变量中。因此,在创建第二种形式时,您创建了一个按钮,该按钮尝试将原始按钮名称作为函数调用,该函数除了引发后台错误外什么都不做。

简而言之,改进了命名并避免在同一范围内重复使用相同的名称。例如:

self.submitButton = ttk.Button(..., command=self.submit)

会避免这个问题。