欢迎光临
我们一直在努力

Gooey 使用指南:一行装饰器把 Python 命令行程序变成完整 GUI 应用

  • 桌面应用
  • UI组件
  • 开发工具

【免费下载链接】Gooey

Turn (almost) any Python command line program into a full GUI application with one line

项目地址:
https://gitcode.com/gh_mirrors/go/Gooey

点击查看 免费下载

Gooey 是一个面向 Python 3 的 GUI 转换库,核心目标是用一行装饰器把(几乎)任何基于 argparse 的命令行程序变成带表单、进度条、成功/失败界面的桌面应用。本文以仓库根目录的 README.md 为主体骨架,结合 gooey/ 目录下的源码实现,系统讲解 Gooey 的安装、工作原理、参数映射、装饰器配置项、布局与运行模式、菜单、动态校验、生命周期事件、进度展示、图标定制与打包,帮助你把“面向程序员”的 CLI 脚本升级为“面向普通用户”的成品软件。

快速上手

安装

最简方式是直接通过 pip 安装:

pip install Gooey

也可以克隆仓库后在本地执行 setup.py 安装:

git clone https://github.com/chriskiehl/Gooey.git
python setup.py install

本仓库对应版本信息见 gooey/init.py,其中 __version__ = '1.2.0-ALPHA',说明当前为 1.2.0 的 Alpha 版本,Events、PublicGooeyState 等 1.2.0 新增功能属于实验性 API,使用前请留意其可能变更。

基础用法

Gooey 通过装饰器挂在包含 argparse 声明的方法(通常是 main)上:

from gooey import Gooey

@Gooey # <— 只需这一行!
def main():
parser = ArgumentParser(…)
# 其余代码

装饰器支持传入大量参数来定制样式与功能,完整用法形如:

# 各种可选参数
@Gooey(advanced=Boolean, # 是否显示完整配置界面
language=language_string, # 界面语言,通过 json 配置
auto_start=True, # 跳过配置界面直接运行
target=executable_cmd, # 显式指定子进程的可执行命令
program_name='name', # 默认取脚本名
program_description, # 默认取 Argparse 的 description
default_size=(610, 530), # GUI 起始尺寸
required_cols=1, # "Required" 分区列数
optional_cols=2, # "Optional" 分区列数
dump_build_config=False, # 导出 Gooey 用于自我配置的 JSON
load_build_config=None, # 从磁盘加载 Gooey 生成的 JSON 配置
monospace_display=False) # 输出面板使用等宽字体
def main():
parser = ArgumentParser(…)
# 其余代码

Gooey 会尽量为每个参数选择合理的默认控件。若需要更精细的控制,可以用 GooeyParser 替代 ArgumentParser,通过 widget 关键字显式指定控件类型:

from gooey import Gooey, GooeyParser

@Gooey
def main():
parser = GooeyParser(description="My Cool GUI Program!")
parser.add_argument('Filename', widget="FileChooser")
parser.add_argument('Date', widget="DateChooser")

示例程序

安装完成后,可以下载官方的 GooeyExamples 示例仓库,里面包含大量可直接运行的脚本,能快速体验 Gooey 的各种布局、控件与特性。

它是什么?

Gooey 把控制台应用转换为对最终用户友好的 GUI 应用。你可以继续用熟悉的方式构建健壮、可配置的程序,而完全不用操心界面如何呈现、普通用户如何交互。

为什么需要它? 命令行在程序员眼中是效率工具,但在普通用户眼中却是上世纪 80 年代的“遗物”。当程序需要提供多种选项时,开发者要么亲手构建 GUI,要么费力向用户解释命令行参数。Gooey 希望一次性解决这两个问题:让程序易于使用,又足够美观。

适合谁? 如果你在为自己或程序员构建工具,或者输出结果需要管道给另一个命令行程序(如 *nix 风格的工具),Gooey 可能并不适合。但如果你在构建“运行即结束”的办公室脚本、搬运数据的工具,或者面向非程序员用户的应用,Gooey 就是理想选择——你可以随心所欲地构建复杂应用,GUI 部分“免费”获得。

工作原理

Gooey 通过装饰器附着在包含 argparse 声明的方法上。运行时,它解析你的 Python 脚本中对 ArgumentParser 的所有引用(较老的 optparse 目前不支持),把这些引用提取出来,根据其提供的 'action' 分配一个 component type,最后用它们组装 GUI。

从源码看,这一过程的关键路径是:

  • gooey_decorator.py 中的 Gooey 装饰器在调用用户函数前,把 ArgumentParser.parse_args 替换为 Gooey 自己的处理器(parser_handler);
  • control.py 的 choose_hander() 依据命令行参数分发到不同处理器:存在 –ignore-gooey 时走 bypass_gooey 直接运行用户代码;否则走 boostrap_gooey 启动 GUI;
  • config_generator.py 的 create_from_parser() 生成 build_spec(target 默认是 python -u <脚本路径>,冻结打包后直接用可执行文件路径);
  • argparse_to_json.py 的 convert() 把 parser 转换为 JSON 形式的 Build Spec;
  • bootstrap.py 的 run() 加载语言、图标并渲染 wx 界面。
  • 参数到控件的默认映射

    Gooey 会根据发现到的选项尽力选择合理默认值。当前 ArgumentParser._actions 到 WX 组件的映射如下:

    Parser ActionWidget说明
    store TextCtrl 普通文本输入
    store_const CheckBox 复选框
    store_true CheckBox 复选框
    store_false CheckBox 复选框
    version CheckBox 版本参数显示为复选框
    append TextCtrl 追加型参数显示为文本输入
    count DropDown 计数参数显示为下拉框
    Mutually Exclusive Group RadioGroup 互斥参数组显示为单选组
    choice DropDown 带 choices 的参数显示为下拉框

    实现上,argparse_to_json.py 的 categorize() 对每个 action 依次判断:is_version 映射为 CheckBox、is_mutex 构建 RadioGroup、is_standard 映射为 TextField、is_readmode_file 映射为 FileChooser、is_writemode_file 映射为 FileSaver、is_choice 映射为 Dropdown、is_flag 映射为 CheckBox、is_counter 映射为 Counter(并预填充 0~10 的选项),其余类型抛出 UnknownWidgetType。

    GooeyParser 与自定义控件

    如果默认映射不够用,可以改用 GooeyParser 显式控制控件类型。它额外接受关键字参数 widget,而且完全不需要改动已有 argparse 代码——直接替换类即可。

    from argparse import ArgumentParser

    def main():
    parser = ArgumentParser(description="My Cool Gooey App!")
    parser.add_argument('filename', help="name of the file to process")

    以上代码默认得到普通文本输入框;换成 GooeyParser 并指定 widget='FileChooser' 后,则变成更友好的文件选择器:

    from gooey import GooeyParser

    def main():
    parser = GooeyParser(description="My Cool Gooey App!")
    parser.add_argument('filename', help="name of the file to process", widget='FileChooser')

    gooey_parser.py 中 GooeyParser 的内部实现会在 add_argument 时把 widget、metavar、gooey_options 分别弹出并记录到自身的 widgets 与 options 字典,同时支持 add_argument_group()、add_mutually_exclusive_group()、add_subparsers() 等与 argparse 对齐的接口;parents 参数还会继承父 parser 的控件与选项配置。

    可用的自定义控件包括:

    Widget说明
    DirChooser / FileChooser / MultiFileChooser / FileSaver / MultiFileSaver 各类目录/文件选择器
    DateChooser / TimeChooser 日期/时间选择器。注意:传给应用的参数值始终为 ISO 格式,而 GUI 部分区域可能按最终用户本地设置显示
    PasswordField 密码输入框
    Listbox 列表框(多选)
    BlockCheckbox 块状复选框。当帮助文本块过大时,默认的 Inline 复选框观感不佳,BlockCheckbox 把文本块放到正常位置,并在控件旁显示简短的 block_label;可用 gooey_options.checkbox_label 控制标签文本
    ColourChooser 颜色选择器
    FilterableDropdown 可过滤下拉框
    IntegerField 整数输入框
    DecimalField 小数输入框
    Slider 滑块

    argparse_to_json.py 中的 VALID_WIDGETS 常量还列出了 MultiDirChooser、Textarea、CheckBox 等完整合法控件名,所有未知控件名会触发 UnknownWidgetType 异常。

    国际化

    Gooey 天生支持多语言,且易于移植到你熟悉的语言。语言通过 Gooey 装饰器参数控制:

    @Gooey(language='russian')
    def main():

    所有程序文本都存放在外部的 json 文件中,因此添加新语言支持只需在 gooey/languages/ 目录粘贴一组键值对即可。仓库自带的语言文件包括 english、chinese、japanese、korean、russian、spanish、french、german、italian、portuguese、turkish、vietnamese、dutch、polish、czech、croatian、serbian、bosnian、greek、hebrew、hindi、tamil、traditional-chinese 等二十余种翻译。其中 english.json 是默认语言(parameters.py 中 language 默认值为 'english'),界面加载路径见 bootstrap.py 的 i18n.load(build_spec['language_dir'], build_spec['language'], build_spec['encoding'])。

    全局配置

    Gooey 几乎所有的外观与行为都可以通过装饰器参数定制。下表汇总了全部参数及含义:

    参数说明
    encoding 显示字符时使用的文本编码(默认 'utf-8')
    use_legacy_titles 把 argparse 默认分组名从 "Positional" 重写为 "Required",主要用于与旧版 Gooey 保持向后兼容
    advanced 切换显示“完整”配置界面还是简化版
    auto_start 跳过配置界面直接运行程序
    language 从 gooey/languages 目录加载哪套语言
    target 指定 Gooey 如何重新调用自身。默认自动寻找 python,此参数可指定程序(及参数)
    suppress_gooey_flag 使用自定义 target 时应设为 True,阻止 Gooey 注入额外的 CLI 参数
    program_name GUI 窗口标题栏显示的名称。默认取 sys.argv[0] 的脚本名
    program_description 设置 Settings 界面顶部面板文本。默认取 ArgumentParser 的 description
    default_size 窗口初始尺寸
    fullscreen 全屏启动 Gooey
    required_cols 必填参数分区的列数。⚠️ 已弃用,见“布局定制”
    optional_cols 可选参数分区的列数。⚠️ 已弃用,见“布局定制”
    dump_build_config 把构建配置以 json 形式保存到磁盘,便于复用/编辑
    load_build_config 从磁盘加载 json 构建配置
    monospace_display 输出面板使用等宽字体。⚠️ 已弃用,见“布局定制”中更灵活的字体配置
    image_dir Gooey 查找自定义图片/图标的目录
    language_dir Gooey 查找自定义语言文件的目录
    disable_stop_button 运行时禁用 Stop 按钮
    show_stop_warning 允许强制终止程序前弹出警告模态框
    force_stop_is_error 提前终止时显示成功还是错误界面
    show_success_modal 成功运行后是否显示摘要模态框
    show_failure_modal 失败时是否显示摘要模态框
    show_restart_button 执行结束后是否显示重启按钮
    run_validators 是否在调用程序前执行校验
    poll_external_updates (实验性)为 True 时,Gooey 会以 gooey-seed-ui 命令行参数调用你的代码,用响应填充 UI 动态值
    use_cmd_args 用运行时提供的命令行参数替换 Gooey 配置中的默认值
    return_to_config 成功运行后返回配置设置窗口
    progress_regex 用于匹配运行时进度信息的文本正则表达式
    progress_expr 应用于 progress_regex 匹配结果的 Python 表达式
    hide_progress_msg 隐藏匹配 progress_regex 的文本进度更新
    disable_progress_bar_animation 禁用进度条动画
    timing_options 与 progress_regex/progress_expr 配合的剩余时间/已用时间显示选项,字典包含 show_time_remaining 与 hide_time_remaining_on_complete,例如 timing_options={'show_time_remaining':True,'hide_time_remaining_on_complete':True}
    show_time_remaining 关闭剩余时间文本
    hide_time_remaining_on_complete 完成界面隐藏剩余时间
    requires_shell 调用程序时是否使用 shell 参数
    shutdown_signal 按下 Stop 按钮时发送给子进程的 signal
    navigation 顶层窗口的导航样式:TABBED(标签页)或 SIDEBAR(侧边栏)
    sidebar_title 控制 SideBar 导航面板上方的标题,默认 "Actions"
    show_sidebar 导航模式为 SIDEBAR 时显示/隐藏侧边栏
    body_bg_color 主窗口背景色(HEX)
    header_bg_color 头部背景色(HEX)
    header_height 头部高度(像素)
    header_show_title 显示/隐藏头部标题
    header_show_subtitle 显示/隐藏头部副标题
    footer_bg_color 底部背景色(HEX)
    sidebar_bg_color 侧边栏背景色(HEX)
    terminal_panel_color 终端面板颜色(HEX)
    terminal_font_color 终端字体颜色(HEX)
    terminal_font_family 终端字体族名称
    terminal_font_weight 字重(constants.FONTWEIGHT_NORMAL、constants.FONTWEIGHT_XXX 等)
    terminal_font_size 终端字体磅值
    error_color 校验错误时显示文本的颜色(HEX)
    richtext_controls 打开/关闭终端控制序列支持(字体粗细与颜色的支持有限)。默认 False
    menus 显示自定义菜单组与菜单项
    clear_before_run 为 True 时,再次运行前清空终端中的历史输出

    默认值细节:以上参数的实际默认值可在 parameters.py 的 gooey_params() 中查到,例如 language 默认 'english'、default_size 默认 (610, 530)、advanced 默认 True、navigation 默认 SIDEBAR、show_sidebar 默认 False、body_bg_color 默认 '#f0f0f0'、header_bg_color 默认 '#ffffff'、header_height 默认 90、terminal_panel_color 默认 '#F0F0F0'、error_color 默认 '#ea7878'、shutdown_signal 默认 signal.SIGTERM。字重取值在 constants.py 中定义(FONTWEIGHT_THIN=100 到 FONTWEIGHT_EXTRAHEAVY=1000),传非法字重会在 parameters.py 的 _get_font_weight() 中抛出 ValueError。

    布局定制

    Gooey 通过少量自定义即可实现相当灵活的布局。最高层级有几种整体布局选项:

    show_sidebar=Trueshow_sidebar=Falsenavigation='TABBED'tabbed_groups=True
    侧边栏导航布局 无侧边栏布局 顶部标签页导航 分组标签页布局

    输入分组:默认情况下,使用 Argparse 的输入会被分成两个桶:positional 和 optional。但这两个分组名称对用户未必直观。你可以用 add_argument_group() 把输入任意归入逻辑分组,并定制每个分组的布局:

    parser = ArgumentParser()
    search_group = parser.add_argument_group(
    "Search Options",
    "Customize the search options"
    )

    向分组添加参数与普通方式一致:

    search_group.add_argument(
    '–query',
    help='Base search string'
    )

    参数便会作为该分组的一部分显示在 UI 中。

    实现层面,argparse_to_json.py 的 process() 会递归提取 _action_groups 为 Group 结构(含 name、description、items、groups、options),并用 reapply_mutex_groups() 把 argparse 独立存储的互斥组重新合并回其声明位置,保证 RadioGroup 出现在正确区域;use_legacy_titles=True 时 apply_default_rewrites() 会把 positional arguments 重写为 required_args_msg、optional arguments 重写为 optional_args_msg。布局渲染相关的 standard_layout() 位于 layouts.py。

    运行模式

    Gooey 提供几种展示模式,便于你针对内容类型与用户水平定制布局。

    Advanced(完整/高级模式)

    默认视图是“完整”或“高级”配置界面,它根据所包裹 CLI 的类型有两种布局。大多数应用使用 Flat Layout(平铺布局),与“主命令 + 众多选项”的经典 CLI 结构(如 Curl、FFMPEG)最匹配。

    另一侧是 Column Layout(分栏布局),最适合有多个子路径、或由多个各带参数的小工具组成的 CLI(类似 git)。它把主路径显示在左栏,对应参数显示在右栏,是把大量不同功能打包进单个应用的好方法。

    两种视图都把 ArgumentParser 中的每个 action 呈现为独立 GUI 组件,非常适合把程序展示给不熟悉命令行参数甚至命令行程序本身的用户。每个组件旁边都会显示帮助信息。

    设置布局风格:目前布局不能显式指定参数(在 TODO 清单上)。布局取决于代码中是否使用了 subparsers——想触发 Column Layout,就需要在 argparse 代码里添加 subparser。是否显示完整界面由 advanced 参数控制:

    @gooey(advanced=True)
    def main():
    # rest of code

    注意:当存在 subparsers 时,argparse_to_json.py 的 assert_subparser_constraints() 会拒绝“顶层存在 required 参数 + subparsers”的组合,抛出 UnsupportedConfiguration;且 config_generator.py 在检测到多个子 parser 时会自动把 show_sidebar 置为 True。

    Basic(基础模式)

    当用户熟悉控制台应用、但你仍想呈现比纯终端更精致的界面时,使用基础模式。将 advanced 设为 False 即可:

    @gooey(advanced=False)
    def main():
    # rest of code

    该模式下 config_generator.py 不再解析 argparse 结构,而是使用默认布局:只提供一个 CommandField("Enter Commands")文本框,让用户直接输入命令行参数。

    No Config(无配置模式)

    No Config 正如其名:不显示配置界面,直接跳到显示区并开始执行宿主程序。这是美化小型一次性脚本的选择。将 auto_start=True 即可:

    @Gooey(auto_start=True)
    def main ():

    菜单栏

    1.0.2 版本加入。

    可以在 Gooey 顶部添加带自定义菜单组与菜单项的菜单栏。菜单以列表形式传给 @Gooey 装饰器:

    @Gooey(menu=[{}, {}, …])

    每个 map 包含两个键值对:

  • name —— 菜单组名称
  • items —— 组内的菜单项列表
  • 菜单组数量不限,全部以列表传给 menu 参数:

    @Gooey(menu=[{'name': 'File', 'items: []},
    {'name': 'Tools', 'items': []},
    {'name': 'Help', 'items': []}])

    每个菜单项同样是键值对 map。其键集合因 type 而异,但有两个键始终存在:

    • type —— 控制菜单项附加的行为以及需要声明的键
    • menuTitle —— 菜单项显示名称

    当前支持四种菜单项类型:AboutDialog、MessageDialog、Link、HtmlDialog。对应的类型定义可在 types.py 中看到(MenuAboutDialog、MenuMessageDialog、MenuLink、MenuHtmlDialog)。

    AboutDialog 是标准的“关于”对话框,用原生 AboutBox 显示程序名称、版本、许可证等信息。

    Schema(均为可选):

    • name、description、version、copyright、license、website、developer

    示例:

    {
    'type': 'AboutDialog',
    'menuTitle': 'About',
    'name': 'Gooey Layout Demo',
    'description': 'An example of Gooey\\'s layout flexibility',
    'version': '1.2.1',
    'copyright': '2018',
    'website': 'https://github.com/chriskiehl/Gooey',
    'developer': 'http://chriskiehl.com/',
    'license': 'MIT'
    }

    MessageDialog 是通用信息对话框,可以展示从简短提示到长篇说明文本的任何内容。

    Schema:

    • message(必填)—— 模态框正文文本
    • caption(可选)—— 模态框标题栏标题

    示例:

    {
    'type': 'MessageDialog',
    'menuTitle': 'Information',
    'message': 'Hey, here is some cool info for ya!',
    'caption': 'Stuff you should know'
    }

    Link 用于把用户带到外部网站,会以默认浏览器打开指定 URL。

    Schema:

    • url(必填)—— 完整 URL

    示例:

    {
    'type': 'Link',
    'menuTitle': 'Visit Out Site',
    'url': 'http://www.example.com'
    }

    HtmlDialog 让你完全控制对话框内显示的内容(额外好处:用户可以复制/粘贴其中的文本)。

    Schema:

    • caption(可选)—— 模态框标题栏标题
    • html(必填)—— 想要显示的 HTML。注意:仅支持一小部分 HTML 子集

    示例:

    {
    'type': 'HtmlDialog',
    'menuTitle': 'Fancy Dialog!',
    'caption': 'Demo of the HtmlDialog',
    'html': '''
    <body bgcolor="white">
    <img src=/path/to/your/image.png" />
    <h1>Hello world!</h1>
    <p><font color="red">Lorem ipsum dolor sit amet, consectetur</font></p>
    </body>
    '''
    }

    完整示例:两个菜单组("File" 与 "Help"),共四个菜单项:

    @Gooey(
    program_name='Advanced Layout Groups',
    menu=[{
    'name': 'File',
    'items': [{
    'type': 'AboutDialog',
    'menuTitle': 'About',
    'name': 'Gooey Layout Demo',
    'description': 'An example of Gooey\\'s layout flexibility',
    'version': '1.2.1',
    'copyright': '2018',
    'website': 'https://github.com/chriskiehl/Gooey',
    'developer': 'http://chriskiehl.com/',
    'license': 'MIT'
    }, {
    'type': 'MessageDialog',
    'menuTitle': 'Information',
    'caption': 'My Message',
    'message': 'I am demoing an informational dialog!'
    }, {
    'type': 'Link',
    'menuTitle': 'Visit Our Site',
    'url': 'https://github.com/chriskiehl/Gooey'
    }]
    },{
    'name': 'Help',
    'items': [{
    'type': 'Link',
    'menuTitle': 'Documentation',
    'url': 'https://www.readthedocs.com/foo'
    }]
    }]
    )

    动态校验(Dynamic Validation)

    ⚠️ 此功能为实验性,API 可能变更甚至移除。欢迎反馈。

    Gooey 可以在把用户输入传给程序前,可选地执行一次特殊的预检(pre-flight)验证,检查所有参数是否通过你指定的校验。

    原理:Gooey 复用 argparse 大多数参数类型可用的 type 参数:

    parser.add_argument('–some-number', type=int)
    parser.add_argument('–some-number', type=float)

    除了 int、float 这类内置类型,你也可以把自己的函数传给 type 参数来审查输入值:

    def must_be_exactly_ten(value):
    number = int(value)
    if number == 10:
    return number
    else:
    raise TypeError("Hey! you need to provide exactly the number 10!")

    def main():
    parser = ArgumentParser()
    parser.add_argument('–ten', type=must_be_exactly_ten)

    如何启用:默认情况下 Gooey 不会运行预检。原因在于该功能相当实验性,幕后做了大量 Monkey Patching,因此目前是主动加入(opt-in)。通过向 use_events 传入 Events.VALIDATE_FORM 来订阅校验事件:

    from gooey import Gooey, Events

    @Gooey(use_events=[Events.VALIDATE_FORM])
    def main():

    此后运行 Gooey 时,在调用主程序之前会先发送一次独立的预校验,并记录你的 type 函数抛出的所有问题。

    完整示例:

    from gooey import Gooey, Events
    from argparse import ArgumentParser

    def must_be_exactly_ten(value):
    number = int(value)
    if number == 10:
    return number
    else:
    raise TypeError("Hey! you need to provide exactly the number 10!")

    @Gooey(program_name='Validation Example', use_events=[Events.VALIDATE_FORM])
    def main():
    parser = ArgumentParser(description="Checkout this validation!")
    parser.add_argument('–ten', metavar='This field should be 10', type=must_be_exactly_ten)
    args = parser.parse_args()
    print(args)

    底层实现:由于 argparse 设计上“一遇到错误就 sys.exit”,Gooey 必须通过 monkey patching 让解析过程收集全部错误而非中断。见 dynamics.py:lift_actions_mutating() 把每个 action 的 type 函数“提升”为 Success/Failure 包装形式(对应 types.py 中的 Try 联合类型),check_value() 把 choices 校验异常改写成 InvalidChoiceException 并记录到错误注册表,collect_errors() 汇总“必填但缺失”“type 转换失败”“choices 非法”“互斥组缺失”四类错误,其中互斥组缺失的错误信息为 'One of these must be provided'。实际分发入口在 control.py 的 validate_form()——检测到 –gooey-validate-form 参数时执行预检并输出序列化结果。

    生命周期事件与 UI 控制

    ⚠️ 此功能为实验性,API 可能变更甚至移除。欢迎反馈。

    自 1.2.0 起,Gooey 暴露了粗粒度的生命周期钩子,你可以在成功或失败后执行额外操作,甚至控制 UI 当前状态。

    当前暴露两个主要钩子:

    • on_success
    • on_error

    它们在进程结束后触发——时机正如其名。

    生命周期处理器的形态:on_success 与 on_error 签名相同:

    from typing import Mapping, Any, Optional
    from gooey.types import PublicGooeyState

    def on_success(args: Mapping[str, Any], state: PublicGooeyState) -> Optional[PublicGooeyState]:
    """
    You can do anything you want in the handler including
    returning an updated UI state for your next run!
    """
    return state

    def on_error(args: Mapping[str, Any], state: PublicGooeyState) -> Optional[PublicGooeyState]:
    """
    You can do anything you want in the handler including
    returning an updated UI state for your next run!
    """
    return state

    • args:解析后的 argparse 对象(即 parse_args() 的输出),是程序被调用时用户参数的一个映射。
    • state:Gooey UI 的当前状态。如果程序使用 subparsers,目前只列出活动 parser/form 的状态。你返回的任何更新版本都会反映到 UI 中。

    挂载处理器:在实例化 GooeyParser 时挂载:

    parser = GooeyParser(
    on_success=my_success_handler,
    on_failure=my_failure_handler)

    订阅生命周期事件:与校验一样,这些事件是 opt-in 的。把想订阅的事件传给装饰器的 use_events 参数:

    from gooey import Gooey, Events

    @Gooey(use_events=[Events.ON_SUCCESS, Events.ON_ERROR])
    def main():

    事件常量的完整定义见 constants.py(Events = ('VALIDATE_FORM', 'ON_SUCCESS', 'ON_ERROR')),parameters.py 的 parse_events() 会校验传入事件合法性,未识别事件会抛出 ValueError。运行完成后,control.py 的 handle_completed_run() 会注入 –gooey-state、–gooey-run-is-success、–gooey-run-is-failure 三个参数,按成功/失败调用对应处理器并把返回状态序列化回 UI。

    进度显示

    用 Gooey 给出可视化进度反馈很简单!如果你已经在输出文本进度更新,可以让 Gooey 挂接这段已有输出来驱动进度条。

    简单场景下,能解析为完成百分比数值的输出字符串(如 Progress 83%)可以配合简单正则变成进度条状态,例如 @Gooey(progress_regex=r"^progress: (\\d+)%$")。

    更复杂的输出可以传入自定义求值表达式 progress_expr,按需转换正则匹配结果。

    满足正则的输出字符串可以通过 hide_progress_msg 参数从控制台隐藏,例如 @Gooey(progress_regex=r"^progress: (\\d+)%$", hide_progress_msg=True)。

    正则与处理表达式:

    @Gooey(progress_regex=r"^progress: (?P<current>\\d+)/(?P<total>\\d+)$",
    progress_expr="current / total * 100")

    程序输出:

    progress: 1/100
    progress: 2/100
    progress: 3/100

    已用 / 剩余时间

    配合进度使用时,Gooey 还支持追踪已用/剩余时间!实现方式与 tqdm 项目类似。通过 timing_options 启用,该参数接收一个字典,键为 show_time_remaining 与 hide_time_remaining_on_complete。默认行为是 show_time_remaining 为 True、hide_time_remaining_on_complete 为 False。注意:这只有在同时使用 progress_regex 和 progress_expr 时才会生效。

    @Gooey(progress_regex=r"^progress: (?P<current>\\d+)/(?P<total>\\d+)$",
    progress_expr="current / total * 100",
    timing_options = {
    'show_time_remaining':True,
    'hide_time_remaining_on_complete':True,
    })

    实现细节:parameters.py 在合并 timing_options 时,默认值为 {'show_time_remaining': False, 'hide_time_remaining_on_complete': True},与 README 中所述默认行为略有出入,实际行为以代码为准。

    自定义图标

    Gooey 自带六张默认图标,可以通过 image_dir 参数告诉 Gooey 在初始化时搜索额外目录,从而用自定义图片覆盖默认图标:

    @Gooey(program_name='Custom icon demo', image_dir='/path/to/my/image/directory')
    def main():
    # rest of program

    Gooey 根据文件名发现图片。例如想提供自定义配置图标,只需在图片目录放置名为 config_icon.png 的图片。以下文件名可以被覆盖:

    • program_icon.png
    • success_icon.png
    • running_icon.png
    • loading_icon.gif
    • config_icon.png
    • error_icon.png

    仓库自带的默认图标位于 gooey/images/,包括 program_icon.png、program_icon.ico、config_icon.png、success_icon.png、error_icon.png、running_icon.png 等,加载逻辑见 bootstrap.py 的 image_repository.loadImages(build_spec['image_dir'])。

    打包为可执行文件

    得益于社区贡献,把 Gooey 程序打包成可执行文件非常容易。PyInstaller 的速成版做法是:把 build.spec 放入应用根目录,编辑其内容,使 APPPNAME 与 name 与你的项目相关、pathex 指向应用根目录,然后执行:

    pyinstaller -F –windowed build.spec

    即可把应用打包成开箱即用的可执行文件。详细的逐步说明见 docs/packaging/Packaging-Gooey.md,自定义镜像打包见 docs/packaging/Packaging-Custom-Images.md。

    注意:bootstrap 源码中显式导入了 wx.html、wx.xml、wx.richtext 等模块,这是为了让 PyInstaller 在 macOS 打包时无需手动指定 hidden_imports。

    附加资源

    • 界面文案与控件文本的多语言文件:gooey/languages/
    • 装饰器与参数默认值:gooey/python_bindings/gooey_decorator.py、gooey/python_bindings/parameters.py
    • argparse 到 GUI 的 JSON 转换:gooey/python_bindings/argparse_to_json.py
    • GUI 启动入口:gooey/gui/bootstrap.py
    • 实验性校验/事件机制:gooey/python_bindings/dynamics.py、gooey/python_bindings/control.py
    • 优雅停止子进程:docs/Gracefully-Stopping.md
    • 富文本控制台支持:docs/Using-Richtext-Controls.md
    • 选项完整参考:docs/Gooey-Options.md
    • 版本发布说明:docs/releases/
    • 测试用例(可运行验证行为):gooey/tests/ 与 gooey/tests/integration/

    分享

    • 桌面应用
    • UI组件
    • 开发工具

    【免费下载链接】Gooey

    Turn (almost) any Python command line program into a full GUI application with one line

    项目地址:
    https://gitcode.com/gh_mirrors/go/Gooey

    点击查看 免费下载

    上一篇:
    终极指南:如何用AhabAssistantLimbusCompany实现《边狱巴士》PC端全自动刷图

    下一篇:
    Legacy Update 技术深度解析:为老旧Windows系统重获安全更新的完整解决方案

    创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

    赞(0)
    未经允许不得转载:171主机测评 » Gooey 使用指南:一行装饰器把 Python 命令行程序变成完整 GUI 应用
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址