2011-12-03 70 views
1

我打算寫一個帶GUI前端的網絡應用程序,大概是使用GTK。GTK網絡應用程序:需要設計模式

我完全不熟悉GTK(以及一般的GUI編程)。我目前的猜測是使用兩個線程,一個處理網絡,另一個運行GTK前端。

這是這類問題的常見設計模式,還是有更好的選擇,例如處理來自GTK主循環內部的網絡?

如果我不得不求助於使用兩個線程,告訴GTK線程有從網絡線程獲得數據的最好方法是什麼?

回答

2

正常的GTK +做事的方式是在主線程上使用GUI,而在其他線程上使用慢操作。請注意,當你想從另一個線程更新GUI時,你必須這樣做inside the GDK lock。文檔中提到「使用Win32後端,GDK調用不應該從多個線程嘗試」,但可以使用g_idle_add來解決,該調用在GUI線程上排隊調用。

可以異步GIO功能的使用(如g_input_stream_read_async)爲您的網絡運營,但沒有什麼使用一個通用的線程庫阻止你,例如:

gtk.gdk.threads_init() 

... 

def on_button_clicked(button): 
    label.set_text("Doing something...") 
    threading.Thread(target=do_something).start() 

def do_something(): 
    time.sleep(2) 
    glib.idle_add(label.set_text, "Done") 

還有用C有點類似的例子(P線程)在以前鏈接的GDK Threads documentation中。

1

在GUI編程中讀到的第一件事是模型視圖控制器模式。您希望儘可能將數據流從GUI中分離出來。網絡代碼更新數據模型。當數據模型發生變化時,它會向前端發出信號,以便GUI可以重繪。

+0

聽起來很直觀。如何向GTK表明數據模型已更改? – Philip

+0

請參閱本教程,瞭解如何在pygtk中創建自定義信號http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm#d0e570 – TJD

相關問題