2011-10-07 114 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

非常感謝答案。重新提到你提到的評論,我必須仔細閱讀它幾次,並且不瞭解它的意義。 –