【问题标题】:Organising a GUI application组织 GUI 应用程序
【发布时间】:2009-02-03 10:39:33
【问题描述】:

这将是一个通用问题。

我正在努力设计一个 GUI 应用程序,尤其是。处理不同部分之间的交互。

我不知道应该如何处理共享状态。一方面,共享状态是不好的,事情应该尽可能明确。另一方面,没有共享状态会在组件之间引入不必要的耦合。

一个例子:

我希望我的应用程序可以通过脚本以 Emacs/Vim 之类的方式进行扩展。显然,需要修改某种共享状态,以便 GUI 使用它。我最初的计划是有一个可以从任何地方访问的全局“会话”,但我不太确定。

一个棘手的用例是键绑定。我希望用户能够从脚本中指定自定义键绑定。每个键绑定映射到一个任意命令,该命令接收会话作为唯一参数。

现在,编辑器组件捕获按键。它必须有权访问每个会话的键映射,因此它需要访问会话。将编辑器与会话耦合是个好主意吗?其他组件也需要访问键绑定,因此会话现在变为共享并且可以是单例...

有没有关于设计超越 MVC 的 GUI 应用程序的好读物?

这是 Python 和 wxPython,FWIW。

[编辑]:添加了具体用例。

【问题讨论】:

    标签: python model-view-controller user-interface architecture wxpython


    【解决方案1】:

    很抱歉这么晚才回答这个问题,但没有什么,我的意思是 没有什么 比查看执行类似操作的应用程序的源代码更好。 (我可能会推荐 http://pida.co.uk 之类的东西,但是那里有很多可扩展的 wx+Python IDE,因为这听起来就像你在做的那样)。

    如果我可以做一些笔记:

    1. 消息传递本身并不是坏事,只要组件遵守接口,它不一定会导致组件之间的耦合。

    2. 共享状态本质上并不坏,但我会根据您的直觉并尽可能少地使用。由于宇宙本身是有状态的,你不能真正完全避免这种情况。我倾向于使用共享的“Boss”对象,它通常是每个应用程序的非单一实例,并负责代理其他组件。

    3. 对于键绑定,我倾向于使用某种“动作”系统。操作是用户可以执行的高级操作,例如:“保存当前缓冲区”,它们可以通过工具栏按钮或菜单项方便地在 UI 中表示。因此,您的脚本/插件会创建操作,并将它们注册到中心位置(例如,某种注册表对象 - 参见 1 和 2)。他们的参与到此为止。最重要的是,您有某种键绑定服务,将键映射到操作(它从注册表中列出,每个会话或其他)。这样就实现了插件和键绑定代码的分离,编辑器和动作代码的分离。作为额外的奖励,您的“配置快捷方式”或“用户定义的键映射”任务变得特别容易。

    我可以继续说下去,但我要说的大部分内容都在 PIDA 代码库中,所以回到我的原点...

    【讨论】:

      【解决方案2】:

      如果您研究过 MVC,那么您可能正朝着正确的方向前进。 MVC、MVP、被动视图、监督控制器。这些都是不同的方式,每一种都有自己的优点和缺点,来完成你所追求的。我发现被动视图是“理想的”,但它会导致您在 GUI 界面(即 IInterface)中引入太多小部件。总的来说,我发现监督控制器是一个很好的折衷方案。

      【讨论】:

        【解决方案3】:

        在 MVC 中,Model 的东西信息的共享状态。

        控件是 GUI 控件设置的共享状态,以及对鼠标点击等的响应。

        你的脚本角度可以

        1) 更新模型对象。这很好。控件可以是模型对象的“观察者”,并且可以更新视图以反映观察到的变化。

        2) 更新控制对象。这不是很好,但是... Control 对象可以对 Model 和/或 View 进行适当的更改。

        我不确定 MVC 有什么问题。您能否提供更详细的设计示例,说明具体问题或顾虑?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-28
          • 1970-01-01
          • 1970-01-01
          • 2010-10-05
          • 2011-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多