如何在Python APP之上创建GUI,以便它可以执行GUI或CLI?

时间:2010-05-18 13:24:39

标签: python xml user-interface gtk glade

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

我假设会有更多代码,但是有一种简单的方法可以检测GTK这样的东西,所以它只在GTK出现时应用了代码吗?

此外,通常在Python中创建GUI:最好是从代码中保留少量GUI细节并使用类似GTK的基于XML的方法(使用gtk.glade.XML()函数)?是否有其他GUI工具包采用与Glade / XML /“代码爆炸”方法类似的方法?

感谢您的任何建议。

安迪

4 个答案:

答案 0 :(得分:10)

  

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

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

  1. 实际工作:foo_core.py

  2. 导入foo_core的CLI模块。称之为foo_cli.py

  3. 导入foo_core的GUI模块。称之为foo_gui.pyw

  4. 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()
    

答案 1 :(得分:1)

这取决于您想要的那种互动。

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

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

答案 2 :(得分:0)

我不建议在XML中使用GUI。所有XML都为您提供了一种描述布局的迷你语言。为什么在你可以拥有python的全部功能时使用迷你语言?

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

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

答案 3 :(得分: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

工作非常好。