2012-09-28 56 views
0

我建立與wxPython的GUI和試圖從我的模型保持我的觀點在黑暗中呆真正的MVC。我正在使用pubsub庫從控制器將訂閱的模型發送消息,然後根據需要更新視圖。wxWidgets的發佈訂閱 - 檢測哪些對象發送消息

我做不過有併發症。我的模型具有同一對象的實例列表,每個對象都需要發送自己的健康和狀態狀態更新消息。每個對象在視圖中都有自己的面板,如下所示。

dining philosopher status table

我的控制器有對象的列表:

kierkegaard = PhilosophersWithMetaData("Soren Kierkegaard", "thumbnails/kierkegaard.jpg", forks[0], forks[4]) 
lewis   = PhilosophersWithMetaData("C.S. Lewis", "thumbnails/lewis.jpg", forks[1], forks[0]) 
dostoevsky = PhilosophersWithMetaData("Fyodor Dostoevsky", "thumbnails/dostoevsky.jpg", forks[2], forks[1]) 
descartes  = PhilosophersWithMetaData("Rene Descartes", "thumbnails/descartes.jpg", forks[3], forks[2]) 
kant   = PhilosophersWithMetaData("Immanuel Kant", "thumbnails/kant.jpg", forks[4], forks[3]) 

philosopher_list = [kierkegaard, lewis, dostoevsky, descartes, kant] 

而且每個哲學家的模型有:

def changeState(self, new_state): 
    self.state = new_state 
    pub.sendMessage("STATE_CHANGED", self.state) 

我的問題是,我怎麼知道哪個對象發送消息,以便我可以更新正確的面板?我需要一個索引或對象來引用,這樣我才能將更新傳遞給視圖。有沒有「MVC批准」的方式來做到這一點?

回答

1

你可以把額外的參數上

Publisher.sendMessage("someMessage",["some_argument",1])

在這種情況下,你會做

Publisher.sendMessage("someMessage",self) 
... 
Publisher.subscribe(self.MyPubsubListenerForSomeMessage,"someMessage") 
... 
def MyPubsubListenterForSomeMessage(self,e): 
    print e.data 
+0

那麼簡單,應該想到這一點。非常感謝。 –

+0

但是這不是錯誤的方式嗎?將消息發送到全局實例,並將其分發給所有偵聽器(針對此消息),並且每個偵聽器決定是否對消息作出反應。從Smalltalk開始,我習慣於一個本地機制:每個模型都保留一個感興趣的觀察者列表,並且只向它們發送消息。被實現爲MVC中要使用的「Model」類的一部分,並且控制器只是在模型對象中註冊爲感興趣的(在Smalltalk中作爲「依賴」)。任何想法爲什麼我們在這裏使用全局性能較差的方案?謝謝 – virtualnobi

+0

有很多不同的事件類型......這是pubsub的行爲。正常的wx.EVT_XXXX只能被有興趣的人綁定。把pubsub想象成一些具有無限eventTypes的全局對象,有興趣的人告訴它他們想要訂閱一些「事件」(實際上只是一個字符串,以及用什麼方法來調用它)......編輯我的答案以包含事件訂閱 –