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工具形式提供給其他人使用。

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

图像

怎么运行的:

相当一部分代码只是样板: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()

图像

输入验证:

现在,确保用户输入适当的数据类型。更新-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驱动的应用打包为一个独立的可执行文件,自定义UI的外观和风格,使文本国际化,以及更多!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容