【问题标题】:Efficient way to create a child window with access to main window disabled?创建禁用访问主窗口的子窗口的有效方法?
【发布时间】:2015-08-27 21:12:08
【问题描述】:

我正在寻找最有效的方法来创建子窗口并禁止对主窗口的所有访问,以便用户必须单击子窗口内的“确定”按钮才能恢复访问权限到主窗口。

这是我的代码,使用 Toplevel 类。可以,但是有没有更有效的方法

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

【问题讨论】:

    标签: python tkinter window tk


    【解决方案1】:

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

    事实上,如果您在 Tk 根窗口上创建一个按钮,并且如果您与此按钮相关联,例如打印某些内容的 lambda 函数,那么在子窗口上“设置抓取”之后将不会打印任何内容.

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

    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

    【讨论】:

    • 在 quit_subwindow() 函数中,我认为 self.grab_set() 应该替换为 self.grab_release,不是吗?但是,它确实比我的第一个解决方案效率更高。
    • @LaurentHermand 不,因为我基本上是在说:“请,tkinter,告诉self(根窗口)'抓住集合'”......好吧,你可以先打电话给@987654331 @ on subWindow,但在这种情况下没有必要,因为它首先被销毁。
    • “抢集”不正确。 “set”是一个动词,如“你正在设置一个窗口”。否则,这是一个很好的答案。
    • @BryanOakley 对不起,谢谢,我会更正它;)事实上,这个表达没有可以理解的翻译成我的母语。
    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多