我在另一個應用程序中使用PyGTK來接受用戶輸入。我正在建立一個有很多檢查按鈕的窗口,根據我的迴應,我需要繼續。使用GTK窗口並等待響應
問題是,在我調用窗口及其操作的函數時,python不等待窗口的響應?我如何使它能夠等待窗口的響應?
我也不知道如果我可以使用對話框而不是窗口,因爲我試圖添加檢查按鈕到對話框,它不能很好地工作。如果使用窗口不合適,任何人都可以幫助我進行對話?
感謝您的幫助。
我在另一個應用程序中使用PyGTK來接受用戶輸入。我正在建立一個有很多檢查按鈕的窗口,根據我的迴應,我需要繼續。使用GTK窗口並等待響應
問題是,在我調用窗口及其操作的函數時,python不等待窗口的響應?我如何使它能夠等待窗口的響應?
我也不知道如果我可以使用對話框而不是窗口,因爲我試圖添加檢查按鈕到對話框,它不能很好地工作。如果使用窗口不合適,任何人都可以幫助我進行對話?
感謝您的幫助。
在這個答案你有使用回調函數的例子: How can I pass variables between two classes/windows in PyGtk?
您確認所謂的窗口後,在執行主叫窗口/對象的回調函數。
(老氣的問題,但它值得答案)
雖然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_button
的ok_button
上連接到clicked
,您可以在對話框(self
)上連接到response
並讀取響應代碼以瞭解您想要返回的內容,運行,例如return None
如果您發現用戶點擊取消。
編輯:我還應該提到,這不僅適用於其他窗口,而且適用於任何要封鎖代碼但不凍結GUI的操作。例如,我將這個模式與gobject.timeout_add
結合使用來爲代表git克隆的進度條設置動畫。使用這個功能,我可以創建一個函數,使用單個for循環來克隆n
存儲庫,而不是將它們與回調一起串入。這真是一個非常強大的模式。
非常感謝。很有幫助。 – WiData