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