2013-05-20 108 views
0

我在另一個應用程序中使用PyGTK來接受用戶輸入。我正在建立一個有很多檢查按鈕的窗口,根據我的迴應,我需要繼續。使用GTK窗口並等待響應

問題是,在我調用窗口及其操作的函數時,python不等待窗口的響應?我如何使它能夠等待窗口的響應?

我也不知道如果我可以使用對話框而不是窗口,因爲我試圖添加檢查按鈕到對話框,它不能很好地工作。如果使用窗口不合適,任何人都可以幫助我進行對話?

感謝您的幫助。

回答

3

(老氣的問題,但它值得答案)

雖然pmoleri給了一個可以接受的答案(這是我最初如何處理這種情況下)我發現,這是一種令人沮喪的,因爲它混淆了添加回調程序流程。有一個窗口,就像gtk.Dialog一樣,你可以調用window.run(),它會在那裏阻塞,直到你得到響應,但GUI仍然會運行。你可以自己用gtk.main()做此功能:

import gtk 
class BlockingWindow(gtk.Window): 
    def __init__(self,checkmark_values): 
     gtk.Window.__init__(self) 
     self.checkmarks = {} 
     # Create check marks here, put them in a dictionary 
     # relating their name to their widget 
     # Also create ok button 
     ok_button.connect("clicked",self.on_ok_button_clicked) 

    def on_ok_button_clicked(self,button): 
     gtk.main_quit() 

    def run(self): 
     self.show_all() 
     gtk.main() 
     self.destroy() 
     return dict((x,self.checkmarks[x].get_active()) for x in self.checkmarks) 

blocking_window = BlockingWindow(["option1","option2"]) 
values = blocking_window.run() 
print "option1 is {}".format(values["option1"]) 
print "option2 is {}".format(values["option2"]) 

gtk.main可以被嵌套,所以這種模式會更加內的另一個GUI窗口,例如中從你的主窗口做同樣的事情(顯然「run」這個名字並不特別,你可能想重新命名它,比如「get_values」或其他)。至於使用對話框,你也可以這樣做,爲了將小部件添加到對話框窗口中,可以引用對話框的「vbox」屬性,即self.vbox.pack_start(my_checkbox)。通常我會使用與此技術結合的對話框,因此我不必自己創建按鈕。在這種情況下,您可以在ok_buttonok_button上連接到clicked,您可以在對話框(self)上連接到response並讀取響應代碼以瞭解您想要返回的內容,運行,例如return None如果您發現用戶點擊取消。

編輯:我還應該提到,這不僅適用於其他窗口,而且適用於任何要封鎖代碼但不凍結GUI的操作。例如,我將這個模式與gobject.timeout_add結合使用來爲代表git克隆的進度條設置動畫。使用這個功能,我可以創建一個函數,使用單個for循環來克隆n存儲庫,而不是將它們與回調一起串入。這真是一個非常強大的模式。