"wait_window"方法有什么作用?

nbr*_*bro 9 python dialog tkinter python-3.x

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

从类的doc字符串中Misc,我们可以观察到:

def wait_window(self, window=None):
    """Wait until a WIDGET is destroyed.
    If no parameter is given self is used."""
Run Code Online (Sandbox Code Playgroud)

乍一看,似乎这种方法可以制作Toplevel模态,但事实并非如此.要制作Toplevel模态,我们必须使用该grab_set()方法.

我看到其他解释:

wait_window 似乎不会返回,直到给定的小部件传递,因为参数未被销毁.

从另一个地方:

wait_window(widget) - 创建等待销毁给定窗口小部件的本地事件.此循环不会影响应用程序的主循环.

effbot文档中,我们有:

wait_window进入本地事件循环,并没有返回,直到给定的窗口被销毁(通过destroy方法,或者明确地通过窗口管理器):

widget.wait_window(window)
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

"Mini-event loop finished!"仅在被Toplevel调用的本地窗口小部件dialog被销毁时才会打印.

那么,究竟在什么情况下我应该使用这种方法呢?

Bry*_*ley 10

与文档状态一样,它等待直到给定的窗口被销毁.它主要用于模态弹出窗口,但它本身并不构成窗口模式.在目标窗口被销毁之前,对函数的调用不会返回要创建模态窗口,您也必须执行抓取.

最常见的用法是创建Toplevel的实例,用窗口小部件填充该窗口,然后在执行其他操作之前等待窗口被关闭.在等待的同时,tkinter能够继续正常处理事件.

例如,您可以禁用(或推迟创建)主GUI,弹出"服务条款"通知,并等待用户确认服务条款,版权,许可证等.一旦窗口被销毁,您然后可以完成初始化,或启用一些小部件等.

标准文件对话框是一个很好的例子:你弹出对话框,然后你的代码等待用户选择一个文件,然后它使用返回的文件名.在内部,对话框的实现使用,wait_window以便在对话框被解除之前不会返回.