调用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.
我敢肯定,这是一个小的失误,但如果有人能告诉我我哪里错我会很感激。
答
使用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."""
只是为了确认,即使这是“来自大型项目的片段”,您是说这个确切的代码会导致您描述的行为?你用什么来运行它 - 从命令行运行时是否发生这种情况(例如:python the_script.py)? –
以下帮助你吗? https://github.com/spyder-ide/spyder/issues/3114 –
@Bryan是的 - 运行这个确切的代码会导致所描述的问题。然而,我用'root.destroy()'替换了'root.quit()',这似乎解决了这个问题。 –