调用Tkinter的root.quit()会导致内核和窗口停止响应

问题描述:

import Tkinter as Tk 

root = Tk.Tk() 

def generate(): 
    root.quit() 

label1 = Tk.Label(root, text="Map Width:") 
label2 = Tk.Label(root, text="Map Height:") 
label3 = Tk.Label(root, text="Lake Size:") 
e1 = Tk.Entry(root) 
e2 = Tk.Entry(root) 
e3 = Tk.Entry(root) 
button1 = Tk.Button(root, text="Generate", command=generate) 
label1.grid(row=0, column=0) 
label2.grid(row=1, column=0) 
label3.grid(row=2, column=0) 
e1.grid(row=0, column=1) 
e2.grid(row=1, column=1) 
e3.grid(row=2, column=1) 
button1.grid(row=3, column=1) 

root.mainloop() 

这是一个较大的项目的一个片段,有为了简单起见,去掉generate()其余功能。通过上面的代码,可以创建一个窗口,其中包含三个标签,三个相应的输入字段和一个按钮。生成按钮旨在调用功能generate(),该功能依次创建基于其他代码的地图对象,然后调用root.quit()调用Tkinter的root.quit()会导致内核和窗口停止响应

然而,当按下按钮时,窗口停止响应和蟒蛇内核反复打印消息:

It seems the kernel died unexpectedly. Use 'Restart kernel' to continue using this console. 

我敢肯定,这是一个小的失误,但如果有人能告诉我我哪里错我会很感激。

+0

只是为了确认,即使这是“来自大型项目的片段”,您是说这个确切的代码会导致您描述的行为?你用什么来运行它 - 从命令行运行时是否发生这种情况(例如:python the_script.py)? –

+0

以下帮助你吗? https://github.com/spyder-ide/spyder/issues/3114 –

+0

@Bryan是的 - 运行这个确切的代码会导致所描述的问题。然而,我用'root.destroy()'替换了'root.quit()',这似乎解决了这个问题。 –

使用root.destroy()而不是root.quit()

root.quit()从我的理解,当你有你的主循环后,你想运行其他代码,这是更好地利用。

"""Quit the Tcl interpreter. All widgets will be destroyed.""" 

root.destroy()将破坏您的主循环内的一切。并应该用于退出程序。

这是tkinter库中方法的引用。

"""Destroy this and all descendants widgets. This will 
     end the application of this Tcl interpreter."""