使用“Gooey”在 GUI 和 CLI 模式之间切换的“聪明”方法

Joe*_*ley 5 python argparse

我正在对一个 GUI 程序进行第一次尝试,该程序包装了一个非常基本的脚本(这样不太懂 CLI 的人就可以运行它)。

我曾希望的一件事是,对于那些如此倾向于的人来说,该脚本仍然可以使用 CLI,并具有相同的选项。

我之所以使用Gooey它,是因为对于刚入门的人来说,它看起来很好而且很简单,但现在我对如何“切换”它感到困惑。

为了使用 GUI,必须使用 python 框架二进制文件来执行脚本,因此我的第一个想法是寻找使用非框架二进制文件显式调用脚本的人,并将 shebang 指向其余#!/usr/bin/env pythonw部分时间。我认为这原则上是可行的,但目前我只能想到使用简单的 if-else 进行测试。

这很好,但是@Gooey装饰器需要使用GooeyParsernot ArgumentParser(from argparse)。所以目前,这意味着我需要在代码中两次调用我的整个参数,这感觉绝对不是Pythonic。

例如:

from gooey import Gooey, GooeyParser

@Gooey(program_name="Hi I'm progam X")
def gui_args():
    """Parse GUI arguments"""    
    parser = GooeyParser()
    parser.add_argument(
        "-f",
        "--file",
        action="store",
        widget="FileChooser",
        help="Some input file."
        )


from argparse import ArgumentParser
def get_args():
    """Parse command line arguments"""    
    parser = ArgumentParser()
    parser.add_argument(
        "-f",
        "--file",
        action="store",
        help="Some input file."
        )

def main():
     if <some_framework_python_test>:
          args = gui_args()
     else:
          args = get_args()
Run Code Online (Sandbox Code Playgroud)

有没有一种巧妙的方法可以根据代码的启动方式在 GUI 和 CLI 行为之间切换,而无需重复代码?

我的其他想法包括基于其他一些线程切换装饰器,但它非常复杂,我还需要在实际代码中GooeyParser切换。ArgumentParser或者也许Gooey已经提供了这一点,但我错过了一些明显的东西(例如,我知道Gooey处理 argparse 风格的帮助格式。

我对 python 框架也不太了解,所以我不知道我提出的建议是否可行。接受所有建议!目前,在不指定二进制文件的情况下运行代码只会引发找不到屏幕的pythonw错误。Gooey

Joe*_*ley 5

因此,正如我所料,肯定有一种“聪明”/优雅的方式。

有一个(当前)未记录的选项--ignore-gooey可以使脚本表现得像普通的 python 脚本。

github repo 上已经创建了一个问题,作者将在不久的将来对此进行记录。

Gooey实际上,在终端中将此参数作为所运行命令的完整表示形式输出,并在 GUI 中提供了所有参数,这就是我在分派要运行的实际代码时注意到的方式。

为了获得全面的答案,如果您通常像这样调用 GUI 程序*:

$ pythonw MyGooeyScript.py
Run Code Online (Sandbox Code Playgroud)

要启动完整的 GUI 会话,您可以像这样调用它:

$ pythonw --ignore-gooey  MyGooeyScript.py <options>
Run Code Online (Sandbox Code Playgroud)

*有时需要以无缓冲模式启动 python,并使用-u.

  • 您不是说 `$ pythonw MyGooeyScript.py --ignore-gooey &lt;options&gt;` 吗? (2认同)