在Python TKinter中创建弹出窗口时禁用底层窗口

36 投票
1 回答
41401 浏览
提问于 2025-04-17 18:48

我有一个主窗口(叫它 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()

撰写回答