什么是" wait_window"方法呢?

时间:2015-02-07 22:44:09

标签: python python-3.x dialog tkinter

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

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

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

1 个答案:

答案 0 :(得分:10)

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

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

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

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