本文最后更新于:2025年11月19日 下午
有时候我们编写的脚本需要弹出GUI对话框提示用户进行下一步操作,或者显示一些信息,或者获取用户的输入。zenity就是这么一个工具,输入一条命令,弹出一个对话框。
支持的对话框类型有如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 应用程序选项: --calendar 显示日历对话框 --entry 显示文本输入对话框 --error 显示错误对话框 --info 显示信息对话框 --file-selection 显示文件选择对话框 --list 显示列表对话框 --notification 显示通知 --progress 显示进度指示对话框 --question 显示问题对话框 --warning 显示警告对话框 --scale 显示范围对话框 --text-info 显示文本信息对话框 --color-selection 显示颜色选择对话框 --password 显示口令对话框 --forms 显示表单对话框 --display=DISPLAY X display to use
|
帮助信息
下面举一些简单的例子。
entry 单行文本输入对话框

输入名字,点击确认后,zenity会向标准输出输入的内容。所以脚本程序只需要捕获输出即可。
question 问题
1
| zenity --question --text "喜欢今天的天气吗" --timeout=5 --ok-label="喜欢" --cancel-label="一般" --title="`date`" --width=300 --height=100
|

这次我们修改了标题,自定义了ok和cancel内容。还添加了超时。问题的肯定还是否定回答,决定应用的返回值。
list 列表
1 2 3 4 5 6 7 8 9 10
| $ zenity --list \ --title="电影列表" \ --column="ID" --column="电影名称" --column="发行年份" \ 1 "肖申克的救赎" 1994 \ 2 "教父" 1972 \ 3 "教父2" 1974 \ 4 "黑暗骑士" 2008 \ 5 "十二怒汉" 1957 \ --width=400 --height=250 3
|

返回数据为选中的行。
text-info 多行文本框
它从一个文件中读入内容,然后展示出来
1 2 3 4
| $ echo -e "hello\nworld\n" > /tmp/ttt.txt $ zenity --text-info --title=备注 --editable --width=500 --height=300 --filename=/tmp/ttt.txt hello world
|

编辑之后确认,它向标准输出打印文本框中内容。
它可以同时获取多个信息
1 2 3 4 5 6 7
| $ zenity --forms --title="注册表单" \ --text="请填写以下信息" \ --separator="," \ --add-entry="姓名" \ --add-password="密码" \ --add-calendar="日期" leon,123456,2024年05月03日
|

最终的结果也是输出到标准输出中,以–separator指定的分割符分割
问题
如何在crontab命令中弹出对话框
配置如下环境变量
1 2 3
| export DISPLAY=":0" export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus" unset GTK_PATH
|
在vscode的命令行中遇到symbol lookup error
报错如下:
1
| zenity: symbol lookup error: /snap/core20/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined symbol: __libc_pthread_init, version GLIBC_PRIVATE
|
去掉如下环境变量即可
替代品
yad–提供更多的选项
人生苦短,远离bug
Leon, 2024-05-03