我已经玩了一段时间用 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 的方式感兴趣,或者指出我严重忽略的一些事情。