"wait_window" 方法有什么作用?

What does the"wait_window" method do?

似乎调用此方法的对象 等待作为参数传递的 window 在继续其自己的循环之前被销毁 ...

Miscclass的文档字符串中,我们可以观察到:

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 seems to not return until the given widget passed as parameter is not destroyed.

来自另一个地方:

wait_window(widget) - Creates a local event that waits for the given widget to be destroyed. This loop doesn't affect the application's mainloop.

根据 effbot 文档,我们有:

The wait_window enters a local event loop, and doesn’t return until the given window is destroyed (either via the destroy method, or explicitly via the window manager):

widget.wait_window(window)

window 等待 window(自身)的确切含义是什么?

似乎调用wait_window之后的代码直到传递给同一方法的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!" 仅当名为 dialog 的本地 Toplevel 小部件被销毁时才会打印。

那么,到底什么情况下我应该使用这个方法呢?

如文档所述,它会一直等到给定的 window 被销毁。它主要用于模态弹出窗口,尽管它本身并不构成 window 模态。在目标 window 被销毁之前,对函数的调用根本不会 return 要创建模态 window,您还必须进行抓取。

最常见的用途是创建 Toplevel 的实例,用小部件填充 window,然后等待 window 被关闭,然后再执行其他操作。在等待期间,tkinter 能够继续正常处理事件。

例如,您可以禁用(或延迟创建)主 GUI,弹出 "terms of service" 通知,并等待用户确认服务条款、版权、许可等。一旦window 被销毁你可以完成初始化,或者启用一些小部件等。

标准文件对话框就是一个完美的例子:您弹出对话框,然后您的代码等待用户选择一个文件,然后它使用 returned 的文件名。在内部,对话框的实现使用 wait_window,因此在关闭对话框之前它不会 return。