&引用;“本地”;发布订阅服务器模式以在MVC wxpython中使用

&引用;“本地”;发布订阅服务器模式以在MVC wxpython中使用,python,wxpython,observer-pattern,publish-subscribe,Python,Wxpython,Observer Pattern,Publish Subscribe,在MVC中使用wxpython,我寻找了一种让模型告诉控制器更改的方法。我找到了(py)pubsub,它实现了一种全局通知机制:消息被发送到一个地方(pubsub发布者),该发布者将消息发送给所有订阅者。每个订户检查消息是否有趣,并执行所需操作 从Smalltalk时代开始,我知道了一种更“局部”的方法:每个模型对象都保存一个感兴趣的控制器列表,并且只向这些控制器发送更改通知。没有涉及全球出版商。这可以作为模型类的一部分来实现,并且工作方式基本相同,只是它是模型和控制器的本地部分 现在是否有理由

在MVC中使用wxpython,我寻找了一种让模型告诉控制器更改的方法。我找到了(py)pubsub,它实现了一种全局通知机制:消息被发送到一个地方(pubsub发布者),该发布者将消息发送给所有订阅者。每个订户检查消息是否有趣,并执行所需操作

从Smalltalk时代开始,我知道了一种更“局部”的方法:每个模型对象都保存一个感兴趣的控制器列表,并且只向这些控制器发送更改通知。没有涉及全球出版商。这可以作为模型类的一部分来实现,并且工作方式基本相同,只是它是模型和控制器的本地部分

现在是否有理由使用全局方法(在我看来,全局方法的性能要差得多,并且可能容易出现与全局方法相关的所有问题)?是否有另一个包实现本地观察者


谢谢

我看不出这里的细微差别。据我所知,pubsub是一个不错的选择。它包含在wx.lin.pubsub的wxPython中,也可以从下载。您可以将侦听器仅放在模型中,将发布器仅放在控制器中,或者按您的需要放置。以下是一些让您开始学习的链接:


我和wxpython一起玩MVC已经有一段时间了,我知道你所说的pubsub是全球性的

我提出的最新想法是,每个视图和模型都有自己的观察者。 观察者对其处理程序的引用很弱,并且都在一个单独的线程中工作,这样就不会阻塞GUI。为了调用GUI线程,我使用wxAnyThread GUI方法装饰器

有3种类型的信号被发送,对于模型,您可以设置观察到哪些属性,当这些属性发生变化时,它们会自动发送信号。然后在模型和视图上都可以发送消息信号或关键字信号。这三种信号类型中的每一种都必须在每个视图或模型中都是唯一的,因为它们被用来生成识别它们的元组

模型属性

控制器处理程序用

@onAttr('attributeName')
def onModelAttributeName(self, attributeName)
@onNotify('Your message')
def onYourMessage(self):
@onNotifyKw('valid', 'value')
def onValidValueKw(self, valid, value)
当您绑定到处理程序赋予其属性的方法时,它会立即使用当前值调用处理程序,然后继续观察更改

发送消息

使用该方法

view/model.notify('Your message'):
view/model.notifyKw(valid=True, value='this)
控制器回调用

@onAttr('attributeName')
def onModelAttributeName(self, attributeName)
@onNotify('Your message')
def onYourMessage(self):
@onNotifyKw('valid', 'value')
def onValidValueKw(self, valid, value)
发送关键字

使用该方法

view/model.notify('Your message'):
view/model.notifyKw(valid=True, value='this)
控制器回调用

@onAttr('attributeName')
def onModelAttributeName(self, attributeName)
@onNotify('Your message')
def onYourMessage(self):
@onNotifyKw('valid', 'value')
def onValidValueKw(self, valid, value)
GUI对模型一无所知。您添加到GUI中的唯一东西是视图信号器,控制器将其自身附加到该信号器上,因此如果您不添加控制器,视图只会很高兴地向任何人发送消息

我已经在github上上传了到目前为止的内容

两者都有单元测试,它应该给出一个例子,说明它的功能,但我将创建一些wxpython示例

我使用的是python 2.7版,而Ysignals模块需要 用于穿线。 请看一看,我会对其他人对这种接近mvc的方式的看法感兴趣,或者指出一些我严重忽视的东西