我尝试使用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。
答案 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
。
希望我把事情弄清楚。