0

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

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

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

谢谢!

4

2 回答 2

0

I'm not really seeing the subtle difference here. As far as I know, pubsub is the way to go. It's included in wxPython in wx.lin.pubsub or you can download it from http://pubsub.sourceforge.net/. You can put the listeners just in the models and the publisher(s) just in the controller or however you need to. Here are a couple links to get you started:

于 2013-03-27T15:53:57.847 回答
0

我已经玩了一段时间用 wxpython 做 MVC,我知道你说的 pubsub 是全局的是什么意思。

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

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

模型属性

控制器处理程序装饰有

@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 的方式感兴趣,或者指出我严重忽略的一些事情。

于 2013-03-28T00:18:55.897 回答