2010-12-06 21 views
2

我想用wxPython實現Observer設計模式。 我有一個建模應用程序,在後臺計算海量數據。有時我想在GUI中顯示模型的輸出---這只是一個不同顏色的方格。其他時候我需要做計算而不顯示GUI。wxPython中的觀察者模式

觀察者模式的好處是,你可以通過添加或刪除一行代碼,像

self.observers.append(MyWxGui()) 

或類似的或不是一個GUI插件。 現在,要做到這一點,我需要我的計算在一個線程上運行,而wx GUI將運行在另一個線程上。 我試圖與wxPython的這樣做,但我總是得到一個致命I/O錯誤:

python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0. 

我讀了在wxPython中多線程教程,如http://wiki.wxpython.org/LongRunningTasks,但它們都具有主循環()在主線程中運行而不是在輔助線程中長時間運行的任務,而我需要的是相反的方式。這是因爲如果我在主線程中擁有Mainloop(),程序會掛起等待GUI中的某個事件,而不是繼續計算。

我還看到我無法在子線程中操作DeviceDC或PaintDC等設備上下文(DC),但我在同一線程中運行了整個wx代碼。

Mainloop()和所有的wx GUI能夠在它自己的線程中運行嗎?它不是主應用程序的線程嗎?

在Ubuntu 10.10 maverick上運行wxPython 2.8.11.0。

+0

您是否知道(wx)python中的observer模式的實現(非線程)?如下所述,Pubsub是全球的發佈者訂閱者的事情,我還沒有找到實現的觀察者模式。 – virtualnobi 2013-03-27 11:25:32

回答

3

如果您閱讀了該wiki頁面,那麼您應該知道可以使用wx.CallAfter,wxCallLater或wx.PostEvent以線程安全的方式與wx線程進行通信。我有一個簡單的教程在這裏:

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

就個人而言,我會使用類似上面提到的與WX MainLoop語句溝通的線程方法PubSub的+之一。 Pubsub的好處在於它可以偵聽消息並對其作出適當的反應。上面的例子實際上顯示了一種方法來做到這一點。希望這會幫助你。否則,我強烈建議加入wxPython郵件列表並詢問:http://groups.google.com/group/wxpython-users/topics?pli=1

+0

我不認爲這回答我的問題。隨着CallAfter和SIM卡。它仍然是調用模型的GUI在開始後繼續處理。我的目標是完全實現Observer模式,並因此讓模型完全在沒有GUI的情況下運行。例如,考慮GUI是否被禁用(即用戶決定不使用GUI來運行該程序):如果模型正在等待GUI發出由CallAfter調用的命令,模型將如何繼續?該模型必須意識到,可能存在一個GUI,它違背了觀察者的想法。 – gozzilli 2011-03-20 13:09:45