组织GUI应用程序

时间:2009-01-22 23:25:41

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

这将是一个普遍的问题。

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

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

一个例子:

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

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

现在,编辑器组件捕获了按键。它必须能够访问每个会话的键映射,因此需要访问会话。是否将编辑器与会话结合起来是一个好主意?其他组件也需要访问键绑定,因此会话现在变为共享,可以是单个...

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

这是Python和wxPython,FWIW。

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

3 个答案:

答案 0 :(得分:3)

很抱歉这么晚就跳过这个问题,但没什么,我的意思是没有什么可以击败查看做类似事情的应用程序的来源。 (我可能会推荐像http://pida.co.uk这样的东西,但是有很多可扩展的wx + Python IDE,因为它听起来就像你正在制作的那样。)

如果我可以做一些笔记:

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

控制内容是GUI控件设置的共享状态以及对鼠标点击的响应以及什么不是。

您的脚本角度可以

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

2)更新Control对象。这不太好,但是......控件对象可以对模型和/或视图进行适当的更改。

我不确定MVC的问题是什么。您能否提供更详细的设计示例以及具体问题或疑虑?