2016-07-30 102 views
0

我有一個python程序,我在其中創建了幾個自定義模態窗口,它們是頂級tkinter窗口的子項。下面是一個這樣的窗口的例子,但我有其他更復雜的窗口。我想做什麼,但不能確定如何,有一個地方,我稱之爲等待迴應。我試過類似下面的東西,它無法創建窗口如何在繼續使用tkinter之前等待模態窗口的響應?

modal = ModalWindow(tk.Tk(), 'Title', 'Text') 
while modal.choice is None: 
    pass 
if modal.choice == 'Yes': 
    # Do Something 

什麼是處理這種類型的東西的適當方式?

自定義模式窗口實例

class ModalWindow(object): 

    def __init__(self, root, title, text): 
     self.choice = None 

     # Setup the window 
     self.modalWindow = tk.Toplevel(root) 
     self.modalWindow.title(title) 
     self.modalWindow.resizable(False, False) 

     # Setup the widgets in the window 
     label = ttk.Label(self.modalWindow, text = text, font = '-size 10') 
     label.grid(row = 0, column = 0, columnspan = 2, padx = 2, pady = 2) 

     but = ttk.Button(self.modalWindow, text = 'Yes', command = self.choiceYes) 
     but.grid(row = 1, column = 0, sticky = 'nsew', padx = 2, pady = 5) 

     but = ttk.Button(self.modalWindow, text = 'No', command = self.choiceNo) 
     but.grid(row = 1, column = 1, sticky = 'nsew', padx = 2, pady = 5) 

     self.modalWindow.rowconfigure(1, minsize = 40) 

    def choiceYes(self): 
     self.choice = 'Yes' 
     self.modalWindow.destroy() 

    def choiceNo(self): 
     self.choice = 'No' 
     self.modalWindow.destroy() 

回答

1

一些進一步的挖掘後,我發現我自己的答案。以下是我想要的。函數wait_window接受一個tkinter窗口並暫停,直到該窗口關閉。

root = tk.Tk() 
modal = ModalWindow(root, 'Title', 'Text') 
root.wait_window(modal.modalWindow) 
if modal.choice == 'Yes': 
    # Do Something 
0

我錯過了一些基本的東西。如果窗口是應用程序模式的,那麼您不得不等待:沒有任何可編程的任務需要完成。如果您試圖等待在屬於另一個應用程序的窗口中發生的事件,那麼除非您編寫一些棘手的OLE代碼,否則您會受到影響(我認爲Windows在這裏,因爲UNIX的做事方式永遠不會讓一個人考慮這樣的解決方案組件)。

+0

但事情是,你不是。使用我寫的Modal Window類,它將GUI引入它自己的線程,GUI等待,但調用它的代碼繼續執行。問題來自於while循環剛剛導致GUI不完全出現的事實。運行代碼,你會看到。 – zephyr

相關問題