在继续使用自己的循环之前,似乎调用此方法的对象等待作为参数传递的窗口被销毁 ...
从Misc
类的doc字符串中,我们可以观察到:
def wait_window(self, window=None): """Wait until a WIDGET is destroyed. If no parameter is given self is used."""
乍一看,似乎这种方法可以制作Toplevel
模态,但事实并非如此。要制作Toplevel
模态,我们必须使用grab_set()
方法。
我看到其他解释:
在给定的窗口小部件作为参数传递之前,
wait_window
似乎不会返回 没有被摧毁。
从另一个地方:
wait_window(widget)
- 创建一个等待给定的本地事件 小部件被摧毁。此循环不会影响应用程序 主循环。
从effbot文档中我们有:
wait_window
进入本地事件循环,并且在给定窗口被销毁之前不会返回(通过destroy方法,或者 明确地通过窗口管理器):widget.wait_window(window)
window
等待window
(本身)究竟意味着什么?
在传递给同一方法的窗口没有被销毁之前,调用wait_window
之后的代码似乎没有被执行。
在下面的工作示例中,我们可以看到刚才所说的证据:
from tkinter import *
def on_win_request(parent):
dialog = Toplevel()
parent.wait_window(dialog)
# executed only when "dialog" is destroyed
print("Mini-event loop finished!")
r = Tk()
b = Button(r, text='New Window', command=lambda: on_win_request(r))
b.pack()
b2 = Button(r, text='Hello!', command=lambda: print("hello"))
b2.pack()
r.mainloop()
仅当名为"Mini-event loop finished!"
的本地Toplevel
窗口小部件被销毁时,才会打印 dialog
。
那么,究竟在什么情况下我应该使用这种方法?
答案 0 :(得分:10)
与文档状态一样,它等待直到给定的窗口被销毁。它主要用于模态弹出窗口,但它本身并不构成窗口模式。对函数的调用根本不会返回,直到目标窗口被销毁为了创建一个模态窗口,你也必须抓取它。
最常见的用法是创建Toplevel的实例,使用小部件填充该窗口,然后在执行其他操作之前等待窗口被解除。在等待的同时,tkinter能够继续正常处理事件。
例如,您可以禁用(或推迟创建)主GUI,弹出"服务条款"请注意,并等待用户确认服务条款,版权,许可等。一旦窗口被销毁,您就可以完成初始化,或启用一些小部件等。
标准文件对话框是一个很好的例子:弹出对话框,然后代码等待用户选择文件,然后它使用返回的文件名。在内部,对话框的实现使用wait_window
,因此在对话框解除之前它不会返回。