似乎调用此方法的对象在继续其自己的循环之前,会等待作为参数传递的窗口被破坏。。。
从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!"
。
那么,在什么样的实际情况下我应该使用这种方法呢?
与文档状态一样,它会等到给定的窗口被销毁。它主要用于模态弹出窗口,尽管它本身并不使窗口成为模态。对函数的调用只是在目标窗口被破坏以生成一个模态窗口之前不会返回,您还必须执行抓取操作。
最常见的用法是创建一个顶层实例,用小部件填充该窗口,然后在执行其他操作之前等待窗口被关闭。在等待的过程中,tkinter能够继续正常处理事件。
例如,您可以禁用(或延迟创建)主GUI,弹出“服务条款”通知,并等待用户确认服务条款、版权、许可证等。一旦窗口被破坏,您就可以完成初始化,或启用一些小部件等
标准文件对话框是一个完美的例子:弹出对话框,然后代码等待用户选择文件,然后使用返回的文件名。在内部,对话框的实现使用
wait_window
,因此在关闭对话框之前它不会返回。相关问题 更多 >
编程相关推荐