调用此方法的对象似乎在等待作为参数传递的窗口被销毁后才继续自己的循环...
从Misc
类的文档字符串中,我们可以观察到:
乍一看,似乎这种方法可以使一个
def wait_window(self, window=None): """Wait until a WIDGET is destroyed. If no parameter is given self is used."""
Toplevel
模态化,但事实并非如此。要使Toplevel
模态化,我们必须使用grab_set()
方法。 我看过其他解释:< p >从另一个地方来:wait_window
似乎不会返回,直到传递的小部件作为参数未被销毁。从 effbot 文档中,我们看到:
wait_window(widget)
- 创建一个本地事件,等待给定的小部件被销毁。这个循环不影响应用程序的主循环。
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()
只有当本地
Toplevel
小部件被销毁时,才会打印出"Mini-event loop finished!"
。那么,在什么实际情况下我应该使用这种方法?
effbot
上的说明,wait_window
进入一个本地事件循环,并且在给定的窗口参数被销毁之前不会返回。因此,在我们对父窗口调用wait_window
的情况下,我们将进入一个本地循环(我猜是在对话框中,或者也许不是?),并且在对话框被销毁之前不会将控制权返回给父窗口... - nbroroot
正在等待Toplevel
:root.wait_window(d.top)
,这就是为什么基本上是父组件让子组件在本地循环上运行,直到子组件被销毁。 - nbro