2011-10-07 101 views
3

我使用的是一个名为customDialog的类,它基于http://effbot.org/tkinterbook/tkinter-dialog-windows.htm 标准代码创建了一个类,其子类为Toplevel,并创建模态对话框。 我试图调整代码,以便它也可以创建无模式对话框。 标准代码调用Toplevel构造函数,创建对话框,然后在末尾执行self.wait_window(self)
,等待对话窗口关闭。 但我没有成功。我天真的尝试是简单地跳过wait_window()(这是我的代码在下面的剪辑尝试)。我试过其他一些东西,但对话框仍然是模态的,也就是说,我无法与应用程序的主窗口进行交互。什么是强制它是模态?通常,对话框包含小部件和一些按钮。无模式对话框tkinter

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) 

回答

4

删除表示self.grab_set()的行。 “抓住”意味着抓住所有事件并将它们引导到这个你不想要的窗口。

如果你读了一下深入到网页,你得到的代码,你会看到,它提到了这个确切的行,为什么它的存在:

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

+0

非常感谢答案。重新提到你提到的评论,我必须仔细阅读它几次,并且不了解它的意义。 –