在Python Tkinter中创建模态对话框需要wait_window()吗?

时间:2015-09-15 05:52:15

标签: python tkinter

我尝试使用Python Tkinter创建模态对话框。我发现使用和不使用wait_window()之间没有区别。

import tkinter as tk

def button_click():
  dlg = tk.Toplevel(master=window)

  tk.Button(dlg, text="Dismiss", command=dlg.destroy).pack()

  dlg.transient(window)    # only one window in the task bar
  dlg.grab_set()           # modal
  #window.wait_window(dlg) # why?

window = tk.Tk()

tk.Button(window, text="Click Me", command=button_click).pack()

window.mainloop()

我见过一些使用wait_window()创建模态对话框的例子。所以我不确定创建模态对话框是否需要该函数。

我正在使用Python 3.5。

2 个答案:

答案 0 :(得分:7)

严格来说,不,wait_window()不需要制作模态对话框。对话模态的作用是你放在窗口上的抓取。

然而,通常,一旦窗口被破坏,您可能需要运行一些其他代码。您可以使用wait_window()来实现此目的,因为它会在继续之前等待窗口被销毁。然后,您可以在此之后使用代码,例如return语句或一些清理代码。在你的情况下,无事可做,所以你不需要拨打wait_window

答案 1 :(得分:1)

使用window.wait_window(dlg)运行代码不会改变任何内容,因为dlg.grab_set()已经创建了模式对话框。这只意味着当window仍然存在时,您无法关闭dlg。您无法关闭窗口,因为模态对话框会抓取window中的所有鼠标事件并将其重定向到null

如果你想创建一个没有grab_set()的模态对话框,你需要将所有鼠标事件绑定到一个处理程序,然后决定是允许还是解除它们使用{{ 1}}。

由于模式对话框是由定义的,所以我的应用程序中的对话框之外的任何内容都可以点击" == False ,您已经只有wait_window的模态对话框。

如果您的申请无法以编程方式关闭grab_set(),那么您也需要window

希望我把事情弄清楚。