0
我建立與wxPython的GUI和試圖從我的模型保持我的觀點在黑暗中呆真正的MVC。我正在使用pubsub庫從控制器將訂閱的模型發送消息,然後根據需要更新視圖。wxWidgets的發佈訂閱 - 檢測哪些對象發送消息
我做不過有併發症。我的模型具有同一對象的實例列表,每個對象都需要發送自己的健康和狀態狀態更新消息。每個對象在視圖中都有自己的面板,如下所示。
我的控制器有對象的列表:
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批准」的方式來做到這一點?
那麼簡單,應該想到這一點。非常感謝。 –
但是這不是錯誤的方式嗎?將消息發送到全局實例,並將其分發給所有偵聽器(針對此消息),並且每個偵聽器決定是否對消息作出反應。從Smalltalk開始,我習慣於一個本地機制:每個模型都保留一個感興趣的觀察者列表,並且只向它們發送消息。被實現爲MVC中要使用的「Model」類的一部分,並且控制器只是在模型對象中註冊爲感興趣的(在Smalltalk中作爲「依賴」)。任何想法爲什麼我們在這裏使用全局性能較差的方案?謝謝 – virtualnobi
有很多不同的事件類型......這是pubsub的行爲。正常的wx.EVT_XXXX只能被有興趣的人綁定。把pubsub想象成一些具有無限eventTypes的全局對象,有興趣的人告訴它他們想要訂閱一些「事件」(實際上只是一個字符串,以及用什麼方法來調用它)......編輯我的答案以包含事件訂閱 –