Gooey 一款为命令行工具制作图形界面的工具

原文链接:Using Gooey as a Universal Frontend for any Language or CLI

如果平时工作中工具编写时,习惯性的做成如linux命令行参数形式,则很容易按照此工具做成对应简易的UI版本。

后面是原链接译文
Gooey是用于為命令行工具制作为桌面应用程序的工具。它可以用作任何语言或程序的前端客户端。无论您是用Java,Node还是Haskell构建应用程序,还是只想在FFMPEG之类的现有工具上添加漂亮的界面,Gooey都可用于创建快速,几乎免费的UI以及少量Python。

如果不想写Python,其实也是可以的。实际上,Gooey完全由普通的JSON文件控制。我们在这里仅使用Python,因为它具有用于生成JSON的便捷绑定。为您的语言提供绑定!

为了展示这一切如何融合在一起,以及它真正适用于任何事物,我们将逐步构建一个图形界面,以实现我一直以来最喜欢的工具之一:FFMPEG。这些步骤适用于任何东西!您可以将FFMPEG换成您自己编写的.jar文件,任意Windows .exe,OSX.app软件包或Linux上任何可执行文件!

为什么还要打包另一个程序?尽管FFMPEG令人惊叹,但绝非友好。实际上,边界线充满敌意。学习曲线基本上只是一堵砖墙。为了使它对理论上的最终用户友好,我们将把它的一个子集公开为一个简单的,熟悉的GUI,用户可以在其中单击并单击成功的方式。此外,由于FFMPEG具有令人惊讶的深度视频处理工具套件,为使事情简单,我们将仅公开其功能的一小部分。我们将构建一个用户界面,用户可以在其中指定

  • 1.输入视频文件,
  • 2.要提取屏幕快照的时间戳,
  • 3.要保存屏幕快照的输出文件名。

简而言之,它将用戶輸入:

ffmpeg -ss 300 -i /home/user/path/to/movie.mkv -frames:v 1 outfile.png

转换为易于使用的桌面应用程序,以UI工具形式提供給其他人使用。

Gooey 一款为命令行工具制作图形界面的工具_第1张图片
image.png

入门

首先 在这里获取适合您的OS的FFMPEG二进制文件并进行安装。

如果一切顺利,您应该可以从命令行调用它并获取一些有用的版本信息

ffmpeg -version

通过这项工作,让我们开始构建事物的UI方面。

步骤1.安装Python

如果您来自其他语言/背景,第一步是安装Python。您可以在此处找到适合您的操作系统的指南。如果您使用的是Windows,则完成操作的最短路径归结为访问python.org,单击大的“下载”按钮,然后双击下载的文件。

步骤2.为项目创建目录和源文件

我们将需要一个python文件来描述我们要构建的GUI。为統一存放,我们会将创建的所有文件放在名为的目录中myproject

mkdir myproject 
cd myproject

在这里,我们将创建所需的源文件main.py

touch main.py

步骤3.安装Gooey

在开始编写所需的少量代码之前,我们必须安装Gooey。在Python领域中,这是通过称为的工具完成的pip。这应该已经在步骤1中与Python一起自动安装了。

pip install Gooey

注意:您通常会在虚拟环境中安装Python依赖项,但是为了便于示例,我们将忽略该细节。

步骤4.让我们创建一个UI!

打开main.py我们在步骤2中创建的文件,然后粘贴以下内容。

from gooey import Gooey, GooeyParser

@Gooey(target="ffmpeg", program_name='Frame Extraction v1.0', suppress_gooey_flag=True) 
def main():
    parser = GooeyParser(description="Extracting frames from a movie using FFMPEG")
    ffmpeg = parser.add_argument_group('Frame Extraction Util')
    ffmpeg.add_argument('-i',
                        metavar='Input Movie',
                        help='The movie for which you want to extract frames',
                        widget='FileChooser')
    ffmpeg.add_argument('output',
                        metavar='Output Image',
                        help='Where to save the extracted frame',
                        widget='FileSaver',
                        )
    ffmpeg.add_argument('-ss',
                        metavar='Timestamp',
                        help='Timestamp of snapshot (in seconds)')
    ffmpeg.add_argument('-frames:v',
                        metavar='Timestamp',
                        default=1,
                        gooey_options={'visible': False})

    parser.parse_args()

if __name__ == '__main__':
    main()

注意:如果熟悉Python,则此代码看起来可疑地类似于Argparse库,这是因为它Argparse代码!Gooey是Argparse支持的所有项目的直接替代品!

这就是将UI固定在现有CLI应用程序前面所需的全部工作!在详细介绍代码之前,让我们先运行一下,然后欣赏我们的工作!

python main.py

Gooey 一款为命令行工具制作图形界面的工具_第2张图片
图像

怎么运行的:

相当一部分代码只是样板:main函数定义,逐个参数条目添加,。您可以通过docs详细了解它们。我们将只关注有趣的部分。

1. 从上到下,我们代码中的第一行值得注意的是@Gooey
@Gooey(target="ffmpeg", program_name='Frame Extraction v1.0', suppress_gooey_flag=True)

target这是最重要的论点。这就是我们告诉Gooey我们正在尝试运行ffmpeg程序。如果您将Gooey与jar包工具一起使用,则可以在此处类似地提供该信息(例如`target='java -jar '). 在运行时,用户在UI中提供的输入将拼接在一起并移交给target中指定的程序來执行。这就是使Gooey可以与任何CLI应用程序一起使用的原因!

2. 下一个值得注意的行是以开头的行ffmpeg.add_argument

这些就是指定在UI中显示为表单字段的内容的方式。呈现给用户的每个字段都会有一个与的关联调用add_argument。他们都有一些共同点:

  • 第一个位置参数-这是我们指定要为其接收输入的CLI变量的位置。在本例中,我们将其设置为-i,这就是将输入文件声明为FFMPEG的方式
  • metavar -这是我们希望在输入字段上显示的易读名称。
  • help -这是显示在输入字段旁边的描述性文本
  • widget-Gooey有很多不同的输入小部件。由于我们正在处理文件IO,因此将相关字段设置为FileChooser/ FileSaver,从而生成您的主机OS使用的本机文件对话框。

下面是有一些稍微改进的方式。

    ffmpeg.add_argument('-frames:v',
                        metavar='Timestamp',
                        default=1,
                        required=True,  # Look at me!
                        gooey_options={'visible': False})

这是一个使用gooey_optionsAPI从界面隐藏该特定组件的工具。该frames:v参数是FFMPEG的次要细节,最终用户不必担心,因此将其设置为ffmpeg需要的值,但实际上并未公开它。

这就是全部!在仅几行Python就构建了一个易于使用的超精细UI,并将通过FFMPEG进行帧提取的复杂任务变成了任何人都可以使用的界面化工具。

不过,可以做进一步优化改善。

添加参数校验

用户界面相当不错,但是有一些问题。例如,用户可以单击start而不填写所有字段,或者可以用无效数据填写字段!解决方法是约束项和校验。

将必填字段设为必填项:

添加required=True到任何要强制用户进行管理的字段中。

@Gooey(target="ffmpeg", program_name='Frame Extraction v1.0', suppress_gooey_flag=True)
def main():
    parser = GooeyParser(description="Extracting frames from a movie using FFMPEG")
    ffmpeg = parser.add_argument_group('Frame Extraction Util')
    ffmpeg.add_argument('-i',
                        metavar='Input Movie',
                        help='The movie for which you want to extract frames',
                        required=True,  # Look at me!
                        widget='FileChooser')
    ffmpeg.add_argument('output',
                        metavar='Output Image',
                        help='Where to save the extracted frame',
                        widget='FileSaver',
                        )
    ffmpeg.add_argument('-ss',
                        metavar='Timestamp',
                        required=True,  # Look at me!
                        help='Timestamp of snapshot (in seconds)')
    ffmpeg.add_argument('-frames:v',
                        metavar='Timestamp',
                        default=1,
                        required=True,  # Look at me!
                        gooey_options={'visible': False})

    parser.parse_args()

Gooey 一款为命令行工具制作图形界面的工具_第3张图片
图像

输入验证:

现在,确保用户输入适当的数据类型。更新-ss参数以使其如下所示。

    ffmpeg.add_argument('-ss',
                        metavar='Timestamp',
                        required=True,  # Look at me!
                        help='Timestamp of snapshot (in seconds)',
                        gooey_options={    # NEW!
                            'validator': {
                                'test': 'user_input.isdigit()',
                                'message': 'Please enter a number'
                            }
                        })

可以在文档中阅读有关验证的全部信息,但总之,这可以告诉Gooey在将ffmpeg传递给ffmpeg之前,先验证用户的输入实际上是一个数字。

Gooey 一款为命令行工具制作图形界面的工具_第4张图片
图像

打包成单一程序文件

有很多选择可以将新的Gooey驱动的应用打包为一个独立的可执行文件,自定义UI的外观和风格,使文本国际化,以及更多!

你可能感兴趣的:(Gooey 一款为命令行工具制作图形界面的工具)