在Python中使用tkinter,关闭根窗口时root.destroy()和之间的区别是什么root.quit()?
一个优先于另一个吗?是否释放了另一个没有的资源?
Eri*_*ikT 24
"quit()会停止TCL解释器.这在大多数情况下都是你想要的,因为你的Tkinter-app也会停止.如果你从空闲中调用你的应用程序,这可能是一个问题.buturn本身就是一个Tkinker-app,因此,如果您在应用程序中调用quit()并且TCL解释器被终止,则空闲也将终止(或混淆).
destroy()只是终止mainloop并删除所有小部件.因此,如果您从另一个Tkinter应用程序调用您的应用程序,或者如果您有多个主循环,那么它似乎更安全."
取自http://www.daniweb.com/forums/thread66698.html
Bry*_*ley 18
root.quit()导致mainloop退出.与所有小部件一样,解释器仍然完好无损.如果调用此函数,则可以在调用之后执行代码root.mainloop(),并且该代码可以与窗口小部件交互(例如,从条目窗口小部件获取值).
调用root.destroy()将销毁所有小部件并退出mainloop.调用之后的任何代码root.mainloop()都将运行,但任何访问任何窗口小部件的尝试(例如,从条目窗口小部件获取值)都将失败,因为窗口小部件不再存在.
tkinter.Tk“quit”方法退出“mainloop”事件处理程序,而“destroy”则销毁所有嵌入的小部件,然后才退出“mainloop”。那么“摧毁”是两者中更好的一个吗?好吧,有时不是。如果“destroy”由于某种原因未能销毁所有小部件,则“mainloop”永远不会退出并且Python会锁定。最好让 Python 在脚本末尾按顺序关闭。
例如,如果您在 Tkinter 窗口中嵌入 Matplotlib 绘图,这会很有用,因为 Matplotlib 自己的小部件使用起来有些笨拙。不幸的是,如果您随后尝试通过单击标题栏中通常的“X”来关闭窗口,窗口会正常关闭,但会让 Python 继续运行。如果脚本是从终端启动的,则您必须按住 Ctrl-C 几分钟才能恢复提示。原因是窗口关闭事件绑定为“销毁”,这不会销毁 Matplotlib 对象,而是使它们成为孤立对象。
解决方法是将窗口关闭事件绑定到“退出”。但是...如果脚本在基于 Tkinter 的 IDE(例如 IDLE)中启动,则会产生一个新问题,因为 IDLE 使 Tkinter 保持运行,因此窗口不会关闭。所以现在必须在主循环之后添加“destroy”。最后,一切都好。
下面是 Matplotlib 图的一个最小示例,可以通过按 Tkinter 按钮来反转该图。它的窗口可以毫无问题地关闭。但是,如果窗口关闭事件被绑定为“销毁”而不是“退出”,那么锁定的 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()
Run Code Online (Sandbox Code Playgroud)
编辑:我将添加通过将窗口关闭事件绑定到这两种方法,您可以避免在“主循环”之后添加一行,如果出于某种原因需要这样做:
root.protocol("WM_DELETE_WINDOW", lambda: (root.quit(), root.destroy()))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19483 次 |
| 最近记录: |