在Python TKinter中创建弹出窗口时禁用底层窗口
我有一个主窗口(叫它 a
),还有一个弹出窗口(叫它 b
)。我想确保当 b
这个窗口打开的时候,用户不能点击 a
窗口里的任何东西。
1 个回答
59
如果你不想把主窗口隐藏起来,而只是想确保用户只能和弹出窗口互动,你可以使用 grab_set()
和 grab_release()
这两个方法。
下面是一个示例应用,已经在 Python 3.7 和 3.8 上测试过:
import tkinter as tk
import sys
import platform
class Popup:
def __init__(self):
self.tl = None
self.root = tk.Tk()
self.root.title("Grab Set/Release")
tk.Label(self.root, text=f"Python v{platform.python_version()}").pack(padx=12, pady=12)
tk.Button(self.root, text="Popup!", width=20, command=self.popup).pack(padx=12, pady=12)
tk.Button(self.root, text="Exit", width=20, command=sys.exit).pack(padx=12, pady=12)
self.root.mainloop()
def popup(self):
if self.tl is None:
self.tl = tk.Toplevel()
tk.Button(self.tl, text="Grab set", width=20, command=self.lock).pack(padx=12, pady=12)
tk.Button(self.tl, text="Grab release", width=20, command=self.unlock).pack(padx=12, pady=12)
def lock(self):
self.tl.grab_set()
print("Grab set!")
def unlock(self):
self.tl.grab_release()
print("Grab released!")
Popup()
另外,你也可以使用 withdraw()
方法把主窗口变得不可见:
root.withdraw()
这样做会让主窗口仍然存在,但只显示 b
窗口。
如果你想让主窗口重新显示,可以使用:
root.deiconify()