python - 组织 GUI 应用程序

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

这将是一个通用问题。

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

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

一个例子:

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

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

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

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

这是 Python 和 wxPython,FWIW。

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

最佳答案

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

如果我可以做一些笔记:

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

  2. 共享状态本身并不是坏事,但我会跟随您的直觉并尽可能少地使用它。由于 Universe 本身是有状态的,因此您无法真正完全避免这一点。我倾向于使用共享的“Boss”对象,它通常是每个应用程序的非单例单实例,并负责代理其他组件。

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

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

关于python - 组织 GUI 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/471279/

相关文章:

python - Matplotlib 根据值使用不同颜色填充区域

python - 保存并加载 keras 子类模型

sqlite - PureMVC 中的异步数据库访问层

java - 如何在 Windows 7 操作系统中运行 .class 文件?

c++ - 有没有办法让 Qt QProgressBar 显示超过 100% 的百分比而不需要使用标签?

java - GUI 无法读取 JTextField

python - 在进程完成之前将日志重定向到文件

python - 使用 matplotlib 简化三角剖分

model-view-controller - Yii 2 从 View 访问 Controller 的更快方法

javascript - Sails.js 与 Meteor - 两者的优势是什么?