2

我正在尝试用 python 编写一个应用程序来使用串行控制电机。这一切都可以在 CLI 情况下正常工作,并且通常是稳定的。但我想知道在此代码库之上添加 GUI 有多简单?

我假设会有更多的代码,但是有没有一种简单的方法来检测像 GTK 这样的东西,所以它只在 GTK 存在时应用代码?

此外,一般来说,在 Python 中创建 GUI:最好在代码中保留尽可能少的 GUI 细节并使用类似 GTK 的基于 XML 的方法(使用 gtk.glade.XML() 函数)?是否有其他 GUI 工具包具有与 Glade/XML/“Explode in Code”方法类似的方法?

感谢您的任何建议。

安迪

4

4 回答 4

12

有没有一种简单的方法来检测像 GTK 这样的东西,所以它只在 GTK 存在时应用代码?

首先,将您的应用分成 3 个独立的模块。

  1. 实际工作:foo_core.py

  2. 导入的 CLI 模块foo_core。调用它foo_cli.py

  3. 导入的 GUI 模块foo_core。调用它foo_gui.pyw

foo_cli模块看起来像这样。

import foo_core
import optparse

def main():
    # parse the command-line options
    # the real work is done by foo_core

if __name__ == "__main__":
   main()

foo_gui模块可能看起来像这样。

 import foo_core
 import gtk # or whatever

 def main()
     # build the GUI
     # real work is done by foo_core under control of the GUI

 if __name__ == "__main__":
     main()

这通常就足够了。可以信任人们自己决定是否需要 CLI 或 GUI。

如果你想迷惑人们,你可以编写一个foo.py类似下面的脚本。

try:
    import foo_gui
    foo_gui.main()
except ImportError:
    import foo_cli
    foo_cli.main()
于 2010-05-18T13:33:54.510 回答
1

这取决于你想要什么样的互动。

如果您想要一个真正的 GUI,您可以使用简陋的对话模式将 GUI 内容与程序逻辑分离,并使用文本“GUI”来处理 CLI。这也有一个很好的副作用,即 GUI 的大部分都可以进行可编程测试。

另一种方法是使用自己的对象分配 sys.stdin 和 sys.stout,这会将您的程序 IO 重定向到 GUI(这不适用于非 python 库)。这意味着您在 GUI 中的交互可能性更少,但编程工作量要少得多。

于 2010-05-18T13:37:41.680 回答
0

我不建议在 XML 中做一个 GUI。XML 所做的只是为您提供了一种用于描述布局的迷你语言。既然可以拥有 python 的全部功能,为什么还要使用迷你语言?

至于检测 GTK,我不建议这样做。相反,添加一个命令行参数来确定是否创建 GUI(例如:myprogram -g)。然后,创建桌面快捷方式或命令行别名以在 GUI 模式下启动变得容易,同时仍然能够从任何终端使用命令行工具。

但是,您确实希望将 GUI 代码与执行实际工作的位分开。给自己一个包含所有业务逻辑的类,然后让 GUI 和 CLI 都访问这个对象来完成工作。

于 2010-05-18T13:34:59.313 回答
0

好吧,我所做的是我有一个唯一的 bash 脚本,其中包含以下内容:

if [ "${0}" == "mcm" ]; then
    /usr/bin/python ${inst_dir}/terminal/mcm-terminal.py ${@}
else
    /usr/bin/python ${inst_dir}/gtk/mcm-gtk.py &
fi

然后我创建两个符号链接: /usr/sbin/mcm 和 /usr/bin/mcm-gtk

效果很好。

于 2010-05-20T16:43:02.037 回答