"What does the wait_window method do?"

2024-03-28 12:09:46 发布

您现在位置:Python中文网/ 问答频道 /正文

似乎调用此方法的对象在继续其自己的循环之前,会等待作为参数传递的窗口被破坏。。。

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 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之后的代码在传递给同一方法的窗口未被破坏之前不会执行。 在下面的工作示例中,我们可以看到对刚才所说内容的证明:

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()

只有当名为dialog的本地Toplevel小部件被销毁时,才会打印"Mini-event loop finished!"

那么,在什么样的实际情况下我应该使用这种方法呢?


Tags: the方法selfloopeventisdefwidget
1条回答
网友
1楼 · 发布于 2024-03-28 12:09:46

与文档状态一样,它会等到给定的窗口被销毁。它主要用于模态弹出窗口,尽管它本身并不使窗口成为模态。对函数的调用只是在目标窗口被破坏以生成一个模态窗口之前不会返回,您还必须执行抓取操作。

最常见的用法是创建一个顶层实例,用小部件填充该窗口,然后在执行其他操作之前等待窗口被关闭。在等待的过程中,tkinter能够继续正常处理事件。

例如,您可以禁用(或延迟创建)主GUI,弹出“服务条款”通知,并等待用户确认服务条款、版权、许可证等。一旦窗口被破坏,您就可以完成初始化,或启用一些小部件等

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

相关问题 更多 >