无模式对话框 tkinter

6 投票
1 回答
3513 浏览
提问于 2025-04-17 03:51

我在使用一个叫做 customDialog 的类,这个类是基于 这个链接 的。标准的代码创建了一个类,这个类是 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 让对话框变成模态窗口

撰写回答