wxwidgets pubsub - 检测哪个对象发送了消息

时间:2012-09-28 18:02:14

标签: python model-view-controller wxpython wxwidgets

我正在使用wxPython构建一个GUI,并试图通过让我的模型在我的模型中处于黑暗状态来保持对MVC的忠诚。我正在使用pubsub库从控制器将订阅的模型发送消息,然后根据需要更新视图。

然而,我确实有一个复杂的问题。我的模型有一个同一对象的实例列表,每个对象都需要发送自己的运行状况和状态更新消息。每个对象在视图中都有自己的面板,如下所示。

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 个答案:

答案 0 :(得分:1)

你可以在

上加上额外的论据

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

在这种情况下你会做

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