2012-09-28 44 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的全局对象,有兴趣的人告诉它他们想要订阅一些“事件”(实际上只是一个字符串,以及用什么方法来调用它)......编辑我的答案以包含事件订阅 –