原文链接: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工具形式提供給其他人使用。
入门
首先 在这里获取适合您的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_options
API从界面隐藏该特定组件的工具。该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的外观和风格,使文本国际化,以及更多!