2012-09-28 2 views
0

wxPython을 사용하여 GUI를 작성하고 내 모델을 어둡게하여 내보기를 유지하여 MVC에 사실을 유지하려고 시도합니다. pubsub 라이브러리를 사용하여 컨트롤러에서 구독 할 모델의 메시지를 보낸 다음 필요에 따라 뷰를 업데이트합니다.wxwidgets 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] 

그리고 모델의 각 철학자가 있습니다 :

dining philosopher status table

내 컨트롤러는 개체의 목록이

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

내 질문은, 어떻게 알 수 있습니까을하는 객체 정확한 패널을 업데이트 할 수 있도록 메시지를 보냈습니까? 뷰에 업데이트를 전달할 수 있도록 참조 할 인덱스 또는 객체가 필요합니다. 이를 수행하는 "MVC 승인 된"방법이 있습니까?

답변

1

당신은 당신이

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

그래서 간단하게는, 그 생각을해야 할 것이 경우에

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

에 추가 인수를 넣을 수 있습니다. 정말 고마워. –

+0

그러나 이것은 잘못된 길은 아닌가? 메시지를 전역 인스턴스로 보내면 전역 인스턴스가 모든 인스턴스를이 인스턴스의 모든 수신기에 배포하고 각 수신기는 메시지에 반응할지 여부를 결정합니다. Smalltalk에서 저는 로컬 메커니즘에 익숙합니다. 각 모델은 관심있는 옵서버의 목록을 유지하고 메시지 만 보냅니다. MVC에서 사용되는 "Model"클래스의 일부로 구현되며 컨트롤러는 모델 객체에 관심이있는 것으로 (Smalltalk에서는 "종속"로) 등록합니다. 왜 우리가 왜 덜 글로벌 한 글로벌 전략을 사용하고 있는지 아는가? 감사합니다 – virtualnobi

+0

다른 이벤트 유형이 많이 있습니다 ... 이것은 특히 pubsub의 행동입니다. 정상적인 wx.EVT_XXXX는 이해 관계자에 의해서만 바인딩됩니다. pubsub을 무한한 eventTypes를 가진 일부 전역 객체라고 생각하면 관심있는 당사자는 일부 "이벤트"(실제로는 문자열과 어떤 메소드가 호출 될지)를 구독하고 싶다고 말합니다. ... 내 대답을 편집하여 이벤트를 포함하도록 편집했습니다. 신청 –

관련 문제