Gooey库入门
Gooey
将(几乎)任何Python3控制台程序转换为GUI程序,仅需(最少)一行代码。
Gooey使用方法与Argparse库极其相似,是Argparse库的直接替代。
我们先从Argparse开始
Argparse库是用来给Python脚本传入位置参数和选项的库(就像Shell脚本一样)
就像这样python test.py -option arg1 arg2
使用方法
库名:argparse
创建一个传参容器对象parser1parser1 = argparse.ArgumentParser()
添加一个位置参数,其名字为a,属性为整数parser1.add_argument("a", type=int)
创建参数对象,每个参数都是它的一个属性args = parser1.parse_args()
调用a参数print(args.a)
Argparse库的优势在于,如果调用脚本时没有使用参数,那么会有详细的回显提示:
1 | error: the following arguments are required: a |
它还会自动添加–help内容
1 | usage: mycode.py [-h] a |
你也可以手动在实例化函数的参数中添加脚本描述,扩充help内容parser1 = argparse.ArgumentParser(description='a test script')
parser1.add_argument("a", type=int, help="this is arg 1")
add_argument的一些设置参数
- name=””
就是位置参数的名字,位于第一位时可以省略name=
- nargs=num
参数的数量,超过1个时,多个参数组成参数列表。特殊的值包括*
任意个,?
0或1个,+
至少1个。 - type=int|bool|string|float|…
参数的数据类型,不解释。 - help=””
有关参数的提示内容,不解释。 - action=””
参数的动作,会在解析到参数时进行触发,一共有六种:store
保存参数值,可能会先将参数值转换成另一个数据类型。若没有显式指定动作,则默认为该动作。store_const
保存一个被定义为参数规格一部分的值,而不是一个来自参数解析而来的值。这通常用于实现非布尔值的命令行标记。store_ture/store_false
保存相应的布尔值。这两个动作被用于实现布尔开关。append
将值保存到一个列表中。若参数重复出现,则保存多个值。append_const
将一个定义在参数规格中的值保存到一个列表中。version
打印关于程序的版本信息,然后退出。 - default=
参数的默认值,不解释。
快速开始
安装指南
最简单的安装方法就是通过pip
pip install Gooey
或者你也可以把Gooey项目clone到本地git clone https://github.com/chriskiehl/Gooey.git
然后运行 setup.py
python setup.py install
基本用法
通过用一个简单的装饰器就可以将Gooey附到任何一个使用argparse
传参的函数上(通常是main函数),然后Gooey就可以将你所有需要用到的参数可视化为文本框、选择框甚至是文件选择框。
1 | from gooey import Gooey |
可以在装饰器中传参以配置不同的风格和功能。
1 | # 一些选项 |
Gooey会尽最大可能自动选择合适的控件来呈现GUI,但是如果想要手动调节,也是可以的。你可以用GooeyParser
函数替代ArgumentParser
函数进行实例化,然后手动添加元素
1 | from gooey import Gooey, GooeyParser |
原理
Gooey可以通过装饰器的方式附在任何使用了argparse
库的函数上。
1 | @Gooey |
在运行时,它会将add_argument
函数中的所有参数传递给ArgumentParser
,然后进行解包并根据指定的action
分配控件,最后在执行parse_args
函数时自动组成GUI。
Mappings:
Gooey尽最大可能根据提供的信息进行控件的映射,目前对应关系如下:
| Parser Action | 对应控件 |
| - | - | - |
| store | TextCtrl/TextField |
| store_const | CheckBox |
| store_true | CheckBox |
| store_false | CheckBox |
| version | CheckBox |
| append | TextCtrl/TextField |
| count | DropDown |
| Mutually Exclusive Group | RadioGroup |
| choice | DropDown |
当没有提供可以参考的参数时,由于默认action
为store
,所以程序默认使用文本输入框控件TextCtrl
。
GooeyParser
如果默认的映射关系不能满足你的需求,你也可以手动设置控件,只需要将ArgumentParser
函数替换为GooeyParser
,两者之间唯一的区别是后者能让你手动指定控件类型。GooeyParser
函数允许你给实例设置额外的参数widget
以指定控件类型。除此之外,你不需要修改任何argparse
相关的代码!
示例
1 | from argparse import ArgumentParser |
按照这段代码,Gooey会生成一个普通的文本框。
有以下几个值得注意的点:
- Python脚本文件名对应的就是程序名。
- description参数值会显示在标题上。
- name和help会显示在对应的交互控件旁边,一般是上方。
如果你使用GooeyParser
并提供了widget
参数的值为FileChooser
,那么你可以显示一个更加友好的文件选择控件:
1 | from gooey import GooeyParser |
自定义增强控件
控件名 | 含义 |
---|---|
DirChooser | 目录选择 |
FileChooser | 文件选择 |
MultiFileChooser | 多文件选择 |
FileSaver | 文件保存 |
MultiFileSaver | 多文件保存 |
DateChooser/TimeChooser | 日期/时间选择 |
PasswordField | 密码输入 |
Listbox | 列表选择 |
BlockCheckbox | 带有文字描述内容的复选框,使用gooey_options.checkbox_label指定文字内容 |
ColourChooser | 选色器 |
FilterableDropdown | 可输入式下拉列表 |
IntegerField | 数字选择 |
DecimalField | 小数选择 |
Slider | 滑动条 |
国际化
Gooey支持国际化设置,只需要在@Gooey
装饰器中加上一个参数:
1 | @Gooey(language='russian') |
所有程序文本都记录在外部的json
文件中,所以要添加新的语言支持,只需要将一些键值对添加到gooey/languages/
目录下。
全局设置
要设置Gooey的外观和功能,只需要向装饰器中传入一些参数即可:
Parameter | Summary |
---|---|
encoding | 字符的编码(默认:’utf-8’) |
advanced | 显示完整的选项菜单 |
auto_start | 跳过所有选项立刻执行程序 |
language | 从gooey/languages 目录中选择一种语言 |
target | Gooey的调用程序,默认使用Python |
suppress_gooey_flag | 如果修改target 的话应当开启以防Gooey注入额外的参数 |
program_name | 程序名,默认使用从sys.argv[0] 获得的文件名 |
program_description | 设置程序描述,默认使用ArgumentParser 中的描述 |
default_size | 默认窗口尺寸 |
fullscreen | 全屏启动Gooey |
dump_build_config | 保存选项到json 文件 |
load_build_config | 加载json 选项文件 |
image_dir | 自定义图标/图片路径 |
language_dir | 语言文件路径 |
disable_stop_button | 运行时禁用Stop 按钮 |
show_stop_warning | 运行被用户中止时发送警告 |
force_stop_is_error | 显示成功/失败提示后立刻退出 |
show_success_modal | 成功后是否显示总结回显 |
show_failure_modal | 失败后是否显示总结回显 |
show_restart_button | 是否显示Restart 按钮 |
run_validators | Gooey执行程序前是否认证 |
use_cmd_args | 将所有运行时提供的位置参数替换为Gooey选项中的默认值 |
return_to_config | 设为真,Gooey会在成功执行后回到选项页面 |
disable_progress_bar_animation | 禁用进度条 |
show_time_remaining | 禁用剩余时间显示 |
hide_time_remaining_on_complete | 完成后禁用剩余时间显示 |
requires_shell | 运行程序时是否需要命令行位置参数 |
shutdown_signal | 按下Stop 按钮时发送的终止信号 |
navigation | 设置Gooey显示风格,可选项:TABBED, SIDEBAR |
sidebar_title | 使用SIDEBAR 时,设置边栏标题,默认为”Actions” |
show_sidebar | 使用SIDEBAR 时,是否显示边栏 |
header_height | 标题高度 |
header_show_title | 是否显示标题 |
header_show_subtitle | 是否显示子标题 |
terminal_font_family | 字体名称 |
terminal_font_weight | 字体粗细(constants.FONTWEIGHT_NORMAL , constants.FONTWEIGHT_XXX ) |
terminal_font_size | 字体大小 |
menus | 显示自定义菜单 |
clear_before_run | 执行前清理上一次的输入内容 |
自定义样式
以下四个参数可以用于设置不同的样式
show_sidebar=True |
show_sidebar=False |
navigation='TABBED' |
tabbed_groups=True |
---|
组合输入
默认搭配argparse
使用Gooey时,输入被分为位置参数和选项参数。但是这并不总是用户想要的划分方式。你可以使用add_argument_group()
函数将任意输出搭配为一个组合对象。
1 | parser = ArgumentParser() |
你也可以把其它参数加入组合中:
1 | search_group.add_argument( |
这些参数会在UI中组合出现
执行模式
Gooey有一系列的呈现模式。
高级模式
默认的显示模式是“完整”或者说“高级”模式。这种模式下分为两种布局,由Gooey转换的命令决定。
第一种布局为平铺布局,这种布局符合大部分CLI程序(比如Curl, FFMPEG)的逻辑,一般情况下这种布局就可以了。
另一种布局是行布局。这种布局适合有多种子工具,每种都有自己的参数和选项的程序(比如Git)。这种布局会在某个位置(边栏或选项卡)显示可选操作,主界面显示给当前操作提供的参数。这种布局很适合同时提供多种功能的小程序。
每一种布局都会把传参容器作为独立的GUI组件呈现出来。
设置布局风格
布局风格由是否存在subparser
决定,所以,如果你想使用行布局,首先确保使用advanced
模式,然后在argparse
代码中添加一个subparser
。
1 | @gooey(advanced=True) |
基础模式
这种模式尤其适合习惯于终端程序的用户。
只需要将@Gooey
装饰器的advanced
参数设为False
即可
1 | @gooey(advanced=False) |
无选项模式
这种模式不提供让用户输入选项的界面,直接进入显示结果的界面并开始执行程序,适用于一部分直接执行的脚本。
启用这一模式,在@Gooey
装饰器中设置auto_start=True
1 |
|
窗口菜单
你可以给Gooey添加一个自定义的菜单。
菜单在@Gooey
装饰器中作为一组映射列表给出:
1 | @Gooey(menu=[{}, {}, ...]) |
每组映射由两对键值对组成:
name
菜单组的名字items
菜单组中每个项目的内容
你可以设置任意数量的菜单组,它们都会作为列表传给@Gooey
装饰器的menu
参数
1 | @Gooey(menu=[{'name': 'File', 'items: []}, |
菜单组中的项目也是键值对的映射列表。它们的键由其type
决定,但是有两个键必须设置。
type
设置点击菜单项的行为,同时也决定它的其它键menuTitle
此菜单项的名字
目前支持四种菜单项类型:
- AboutDialog
- MessageDialog
- Link
- HtmlDialog
AboutDialog
是程序的关于对话框。它会显示程序的信息,包括名字,版本和许可证等等。
可选的内容:
name
description
version
copyright
license
website
developer
示例:
1 | { |
MessageDialog
是通用的信息对话框,你可以通过此对话框显示任何种类的信息,比如警告。
内容:
message
必须,信息的内容caption
可选,信息的标题
示例:
1 | { |
Link
用于将用户带去外部的网站,这一选项会唤出默认浏览器。
内容:
url
完整的URL
示例:
1 | { |
HtmlDialog
用户可以拷贝的,HTML格式的信息对话框。
内容:
caption
可选,对话框的标题html
必须,在对话框中显示的HTML内容
示例:
1 | { |
一个完整的示例
两个菜单组,各自带有不同的菜单项:
1 |
|
自定义图标
Gooey默认自带了六个图标。但是你也可以用自己的图片/图标对其进行替换,只需要告诉Gooey在初始化时搜索的路径即可。
给@Gooey
装饰器指定image_dir
参数:
1 | @Gooey(program_name='自定义图标测试', image_dir='/path/to/my/image/directory') |
Gooey会根据文件名自动发现图片并进行替换。比如,举例来说,要替换程序图标,只需要在图片目录下添加一个名为config_icon.png
的文件即可。
以下为可以覆盖的文件名:
- program_icon.png
- success_icon.png
- running_icon.png
- loading_icon.gif
- config_icon.png
- error_icon.png
打包
打包Gooey项目也很简单。
一种简单的办法是下载这个build.spec文件并放到程序目录下,然后编辑文件内容,修改APPPNAME
和name
这两项以对应你的项目,然后修改pathex
项以指定程序的根目录,然后执行pyinstaller -F --windowed build.spec
,就可以进行打包了。
你也可以看看详细教程.