【问题标题】:"Local" publish-subscriber pattern for use in MVC wxpython用于 MVC wxpython 的“本地”发布-订阅者模式
【发布时间】:2013-03-27 11:13:13
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: python wxpython observer-pattern publish-subscribe


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-12-14
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        相关资源
        最近更新 更多