我第二次使用 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)
会避免这个问题。
基本上,我在根目录中有一个创建顶层的按钮。然后在 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)
会避免这个问题。