root.destroy()和root.quit()之间有什么区别?

时间:2010-02-21 21:09:22

标签: python tkinter

在使用tkinter的Python中,关闭根窗口时root.destroy()root.quit()之间有什么区别?

是否优先考虑另一个?是否有人发布另一个没有的资源?

4 个答案:

答案 0 :(得分:24)

“quit()停止TCL解释器。这在大多数情况下都是你想要的,因为你的Tkinter-app也会停止。如果你从空闲状态调用你的应用程序,这可能是一个问题.buturn本身就是一个Tkinker -app,所以如果你在app中调用quit()并且TCL解释器被终止,那么idle也会终止(或者混淆)。

destroy()只是终止主循环并删除所有小部件。因此,如果您从另一个Tkinter应用程序调用您的应用程序,或者如果您有多个主循环,那么它似乎更安全。“

取自http://www.daniweb.com/forums/thread66698.html

答案 1 :(得分:15)

root.quit()导致mainloop退出。与所有小部件一样,解释器仍然完好无损。如果调用此函数,则可以在调用root.mainloop()之后执行代码,并且该代码可以与小部件交互(例如,从条目小部件获取值)。

调用root.destroy()将销毁所有小部件并退出mainloop。调用root.mainloop()之后的任何代码都将运行,但任何访问任何小部件的尝试(例如,从条目小部件获取值)都将失败,因为小部件不再存在。

答案 2 :(得分:0)

我在root.quit()root.destroy()上的经历...

我有一个dos python脚本,该脚本调用tkinter脚本(从组合框的一组已知值中进行选择),然后返回至dos脚本以完成其他操作。

我添加到父脚本中的TKinter脚本。我可能会将所有内容转换为tkinter,但是暂时可以使用组合。它的工作方式如下:

要在选择完成后摆脱Windows框,我需要
1)root.quit() 在回调函数中,在该函数中,所有按键操作都已被处理。
2)root.destroy() 在主循环之后破坏窗口框。

如果我在回调中使用root.destroy(),则会收到一条错误消息,提示无法再访问tkinter对象。

在主循环后没有root.destroy()的情况下,窗口框保持在线,直到整个父脚本完成。

答案 3 :(得分:0)

tkinter.Tk的“ quit”方法退出“ mainloop”事件处理程序,“ destroy”破坏所有嵌入式小部件,只有 then 退出“ mainloop”。那么“破坏”是两者中最好的吗?好吧,有时候不行。如果“ destroy”由于某种原因未能破坏所有小部件,则“ mainloop”将永远不会退出并且Python会锁定。最好让Python在脚本末尾按顺序关闭程序。

例如,如果将Matplotlib图嵌入到Tkinter窗口中,这将很有用,因为Matplotlib自己的窗口小部件使用起来有些笨拙。不幸的是,如果您随后尝试通过单击标题栏中的常规“ X”来关闭窗口,则该窗口可以关闭,但仍使Python运行。如果脚本是从终端启动的,则必须将Ctrl-C混搭几分钟,以返回提示。原因是窗口关闭事件绑定到“破坏”,不会破坏Matplotlib对象,而是使它们成为孤立对象。

解决方法是将窗口关闭事件绑定为“退出”。但是...如果脚本是在基于Tkinter的IDE(如IDLE)中启动的,那么会产生一个新问题,因为IDLE使Tkinter处于运行状态,因此窗口无法关闭。因此,现在必须在mainloop之后添加“ destroy”。最后,一切都很好。

下面是Matplotlib图的最小示例,可以通过按下Tkinter按钮将其反转。可以毫无问题地关闭其窗口。但是,如果将Windows-close事件绑定到“破坏”而不是“退出”,则将保留锁定的Python进程。

#!/usr/bin/env python3
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
root = tk.Tk()
data, = plt.plot([0,5,3,4,-5,3])
canvas = FigureCanvasTkAgg(plt.gcf(), master=root)
invert = lambda: (data.set_ydata(-data.get_ydata()), canvas.draw())
tk.Button(master=root, text="Invert", command=invert).pack()
canvas.get_tk_widget().pack(fill=tk.BOTH, expand=1)
root.protocol("WM_DELETE_WINDOW", root.quit)
root.mainloop()
root.destroy()

编辑:我将通过将window-close事件绑定到两个方法来添加,可以避免由于某些原因而在“ mainloop”之后添加一行:

root.protocol("WM_DELETE_WINDOW", lambda: (root.quit(), root.destroy()))