创建子 window 并禁用对主 window 的访问的有效方法?

Efficient way to create a child window with access to main window disabled?

我正在寻找创建子 window 的最有效方法,并且还禁止对主 window 的所有访问,以便用户必须单击 "OK" 子 window 内的按钮,以便恢复对主 window 的访问。

这是我的代码,使用 Toplevel class。它有效,但是有没有更有效的方法

from tkinter import *

class MainWindow(Tk):

    def __init__(self):
        Tk.__init__(self)

    def SetEnableStatus(self, status):
        for w in self.winfo_children():
            if status == False:
                w.grab_set()
            else:
                w.grab_release()

    def CreateChildWindow(self):            
        subWindow = Toplevel(self)

        def quit_subwindow():
            subWindow.destroy()
            self.SetEnableStatus(True) # Enable all widgets of main window

        Button(subWindow, text='Exit', command=quit_subwindow).pack()

        self.SetEnableStatus(False) # Disable all widgets of main window

Toplevel object上调用grab_set应该就够了,当你用完了,你可以简单地销毁它,然后调用grab_setself 上(但我不是 100% 确定,即使下面的结果程序证实了这一点)。

事实上,如果您在 Tk 根 window 上创建一个按钮,并且如果您与此按钮相关联,例如打印某些内容的 lambda 函数,那么在 "setting the grab" 在 child window.

请参阅以下示例,其中基本上所有事件都重定向到 Toplevel window,而不是 Tk 根目录 window:

from tkinter import *


class MainWindow(Tk):

    def __init__(self):
        Tk.__init__(self)
        Entry(self).pack(side="left")
        Button(self, text="whoami", command=lambda : print("A Tk root window.")).pack(side="left")

    def CreateChildWindow(self):            
        subWindow = Toplevel(self)

        def quit_subwindow():
            subWindow.destroy()
            self.grab_set()

        Button(subWindow, text="whoami", command=lambda : print("A Toplevel child window.")).pack()
        Button(subWindow, text='Exit', command=quit_subwindow).pack()
        subWindow.grab_set()


win = MainWindow()
win.CreateChildWindow()
win.mainloop()

查看 effbot.org 上的以下文章,了解有关如何创建对话框的更多信息:

http://effbot.org/tkinterbook/tkinter-dialog-windows.htm