用于MVC wxpython的“本地”发布 - 订阅者模式

时间:2013-03-27 11:13:13

标签: python wxpython observer-pattern publish-subscribe

在MVC中使用wxpython,我找了一种让模型告诉控制器有关变化的方法。我找到了(py)pubsub,它实现了一个全局通知机制:消息被发送到一个地方(pubsub Publisher),它将它们发送给所有订阅者。每个订户检查消息是否有趣,并做了所需的事情。

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

现在是否有理由使用全球方法(对我来说似乎效率低下,并且可能容易出现与全球方法相关的所有问题)?是否有另一个实施本地观察员的包?

谢谢!

2 个答案:

答案 0 :(得分:0)

我真的没有看到这里的细微差别。据我所知,pubsub是要走的路。它包含在wx.lin.pubsub中的wxPython中,或者您可以从http://pubsub.sourceforge.net/下载它。您可以将侦听器放在模型中,只将发布者放在控制器中,或者您需要。这里有几个链接可以帮助您入门:

答案 1 :(得分:0)

我已经玩了一段时间用wxpython做MVC,我知道你对pubsub是全球性的意思。

我提出的最新想法是每个视图和模型都有自己的观察者。 观察者对其处理程序的引用很弱,并且它们都在一个单独的线程中工作,以便不阻止GUI。要使用wxAnyThread Gui方法装饰器回调GUI线程。

有三种类型的信号被发送,对于模型,您可以设置观察哪些属性,它们在更改时自动发出信号。然后在模型和视图上,您​​可以发送消息信号或关键字信号。三种信号类型中的每一种都必须在每个视图或模型中是唯一的,因为它们用于制作识别它们的元组。

模型属性

控制器处理程序用

修饰
@onAttr('attributeName')
def onModelAttributeName(self, attributeName)

当你绑定到一个方法,处理程序将其立即归属时,会调用处理程序及其当前值,然后继续观察更改。

发送消息

使用方法

view/model.notify('Your message'):

控制器回调用

修饰
@onNotify('Your message')
def onYourMessage(self):

发送关键字

使用方法

view/model.notifyKw(valid=True, value='this)

控制器回调用

修饰
@onNotifyKw('valid', 'value')
def onValidValueKw(self, valid, value)

GUI对模型一无所知你向GUI添加的唯一内容就是视图信号器,控制器将它自己附加到此,所以如果你不添加控制器,视图就会很开心向所有人发送消息。

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

https://github.com/Yoriz/Y_Signal

https://github.com/Yoriz/Y_Mvc

两者都有单元测试,应该给出一些它的例子,但我会创建一些wxpython示例。

我使用python版本2.7和Ysignals模块需要 https://pypi.python.org/pypi/futures/2.1.3用于线程。 请看一下对别人对这种接近mvc的方式的看法感兴趣,或者指出一些我严重忽视的事情。