无模态对话框 tkinter

6
我正在使用一个名为customDialog的类,基于http://effbot.org/tkinterbook/tkinter-dialog-windows.htm。标准代码创建了一个继承自Toplevel的类,并创建模态对话框。我试图修改代码,使其也能创建非模态对话框。标准代码调用Toplevel构造函数,创建对话框,然后在最后执行self.wait_window(self),等待对话框窗口关闭。但我没有成功。我的天真尝试是简单地跳过wait_window()(这是我下面代码片段中的尝试)。我尝试了其他几个方法,但对话框仍然是模态的,即我无法与应用程序的主窗口交互。是什么导致它是模态的?对话框包含小部件和一些按钮,通常如此。
class Dialog(Toplevel):

    def __init__(self, parent, title = None,modal=True):
        Toplevel.__init__(self, parent)
        self.transient(parent)
        if title:
            self.title(title)
        self.parent = parent
        self.result = None
        body = Frame(self)
        #register validators
        self.validatePosInt = (body.register(self.OnValidatePosInt),
                '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

        self.initial_focus = self.body(body)   #this calls the body function which is overridden, and which draws the dialog
        body.grid()
        self.buttonbox()
        self.grab_set()
        if not self.initial_focus:
            self.initial_focus = self
        self.protocol("WM_DELETE_WINDOW", self.cancel)
        self.geometry("+%d+%d" % (parent.winfo_rootx()+50,
                                  parent.winfo_rooty()+50))
        self.initial_focus.focus_set()

        if modal:
            self.wait_window(self)
1个回答

7

移除代码中的 self.grab_set() 这一行。"grab" 的意思是抓取所有事件并将其定向到此窗口,而这不是你想要的。

如果你深入阅读获取该代码的网页,你会发现它提到了这一行以及它存在的原因:

... 接下来,构造函数创建对话框主体,然后调用 grab_set 使对话框变成模态的


非常感谢您的回答。关于您提到的评论,我可能读了几遍,但没有理解它的重要性。 - Tim Richardson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接