wxwidgets pubsub Определить, какой объект отправил сообщение

Я создаю графический интерфейс с помощью wxPython и пытаюсь оставаться верным MVC, сохраняя свое представление в темноте от моей модели. Я использую библиотеку pubsub для отправки сообщений из модели, на которую подпишется контроллер, а затем при необходимости обновлю представление.

Однако у меня есть осложнение. В моей модели есть список экземпляров одного и того же объекта, и каждый объект должен будет отправить свое собственное сообщение об обновлении состояния и работоспособности. Каждый объект имеет свою собственную панель в представлении, как показано ниже.

таблица статуса обедающего философа

Мой контроллер имеет список объектов:

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» способ сделать это?


person pk-nb    schedule 28.09.2012    source источник


Ответы (1)


вы можете добавить дополнительные аргументы в

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

В этом случае вы бы сделали

Publisher.sendMessage("someMessage",self)
...
Publisher.subscribe(self.MyPubsubListenerForSomeMessage,"someMessage")
... 
def MyPubsubListenterForSomeMessage(self,e):
    print e.data
person Joran Beasley    schedule 28.09.2012
comment
Так просто, надо было подумать об этом. Спасибо большое. - person pk-nb; 28.09.2012
comment
Но разве это не неправильный путь? Отправьте сообщение в глобальный экземпляр, который рассылает его всем слушателям (для этого сообщения), и каждый слушатель решает, реагировать ли на сообщение. От Smalltalk я привык к локальному механизму: каждая модель ведет список заинтересованных наблюдателей и отправляет сообщения только им. Реализуется как часть класса Model для использования в MVC, а контроллер просто регистрируется как заинтересованный (в Smalltalk как зависимый) с объектом модели. Есть идеи, почему мы используем здесь глобальную, менее производительную схему? Спасибо - person virtualnobi; 27.03.2013
comment
существует множество различных типов событий... это особенно характерно для pubsub. обычный wx.EVT_XXXX связывают только заинтересованные стороны. подумайте о pubsub как о каком-то глобальном объекте с бесконечными типами событий, заинтересованные стороны говорят ему, что хотят подписаться на какое-то событие (на самом деле это просто строка и какой метод будет вызываться с ней). ... отредактировал мой ответ, чтобы включить подписку на событие - person Joran Beasley; 27.03.2013