🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ` `Zenity是一个开源和跨平台的应用程序,它在命令行中显示GTK +对话框并使用shell脚本。 ` `**GNU Linux**的操作系统建立在非常强大的**内核**称为Linux。Linux以其命令行操作而闻名。随着Linux在日常和桌面计算中的发明,nix保持不再偏向命令行,它同样是图形化和开发图形应用程序保持不再是一个困难的任务。 ![](https://img.kancloud.cn/a7/89/a789daf636550bef776a782f83d73a28_709x461.png) ## Zenity是什么 ` `**enity**是一个开源和显示**GTK +对话框**的命令行和使用shell脚本一个跨平台的应用程序。它允许在图形框中向/从shell请求和呈现信息。该应用程序允许您在命令行中创建图形对话框,并使用户和shell之间的交互非常容易。 ` `还有其他的替代品,但没有比zenity简单的,特别是当你不需要复杂的编程。Zenity,一个工具,你必须有你的手。 ## Zenity特性 1. FOSS软件 2. 跨平台应用程序 3. 允许GTK +对话框执行 4. 命令行工具 5. 在Shell脚本中的支持 ## 用处 1. 轻松创建GUI 2. 比其他复杂工具更少的功能 3. 使shell脚本能够与GUI用户交互 4. 对于图形用户交互,可以进行简单的对话创建 ## 在Linux中安装Zenity ` `**Zentity**默认安装或者在今天大多数的标准Linux发行库可用。您可以通过执行以下命令检查是否安装到您的机器上。 ~~~ yhp@yhp-PC:~$ zenity --version 3.22.0 ~~~ ~~~ yhp@yhp-PC:~$ whereis zenity zenity: /usr/bin/zenity /usr/share/zenity /usr/share/man/man1/zenity.1.gz ~~~ ` `如果它没有安装,您可以使用如下**apt**或**Yum**命令进行安装。 ~~~ ravisaive@howtoing:~$ sudo apt-get install zenity [on Debian based systems] root@howtoing:~# yum install zenity [on RedHat based systems] ~~~ ` `此外,您还可以从源文件建立它,使用下面的链接下载最新**的zenity**源代码包。 [http://ftp.gnome.org/pub/gnome/sources/zenity/](http://ftp.gnome.org/pub/gnome/sources/zenity/) ## Zenity基本对话框 ` `一些**的zenity**的基本对话框,它可以直接在命令行调用的。 ### 1.快速日历对话框怎么样? ~~~ yhp@yhp-PC:~$ zenity --calendar ~~~ ![](https://img.kancloud.cn/12/64/1264bcb004f7d18ef4399adbc5ac9cff_185x339.png) ### 2.错误对话框 ~~~ yhp@yhp-PC:~$ zenity --error ~~~ ![](https://img.kancloud.cn/71/03/71034883ed665e9a8d83270cf44ff180_168x169.png) ### 3.一般文本输入对话框 ~~~ yhp@yhp-PC:~$ zenity --entry ~~~ ![](https://img.kancloud.cn/04/94/0494750c6e7ee5752624d118d4299985_192x146.png) ### 4.信息对话框 ~~~ yhp@yhp-PC:~$ zenity --info ~~~ ![](https://img.kancloud.cn/51/e0/51e05719dfa705f36097cc32a436367c_192x195.png) ### 5.问题对话框 ~~~ yhp@yhp-PC:~$ zenity --question ~~~ ![](https://img.kancloud.cn/b7/c0/b7c0adf05ca7bb48b137d6780ff46c6c_699x254.png) ### 6.进度栏 ~~~ yhp@yhp-PC:~$ zenity --progress ~~~ ![](https://img.kancloud.cn/2b/ad/2bad2902e1b035472acc355ce4720f65_373x163.png) ### 7.缩放对话框 ~~~ yhp@yhp-PC:~$ zenity --scale ~~~ ![](https://img.kancloud.cn/ea/95/ea95e1ff0400f0b66b8098c2df7a9d4a_299x144.png) ### 8.密码对话框 ~~~ yhp@yhp-PC:~$ zenity --password ~~~ ![](https://img.kancloud.cn/49/1c/491c29528bbf6ee5eed705bb6bc08a54_264x193.png) ### 9.窗体对话框 ~~~ yhp@yhp-PC:~$ zenity --forms ~~~ ![](https://img.kancloud.cn/3d/33/3d33a34d899b37de88a1bba68e2564cd_189x123.png) ### 10.关于对话 ~~~ yhp@yhp-PC:~$ zenity --about ~~~ ![](https://img.kancloud.cn/a9/0d/a90db4f6cbd8c786fce1cdbe7ddeffb6_427x281.png) ## 创建Shell脚本对话框 ` `现在,我们将使用要讨论**的zenity对话框**创建简单的shell脚本在这里。虽然我们可以通过执行创建一个对话框**的zenity**直接从shell命令(象我们上面那样),但是我们不能为了获得一些有意义的结果链接两个对话框。 ` `如果一个交互式对话框从你的输入,并显示结果。 ~~~ #!/bin/bash first=$(zenity --title="Your's First Name" --text "What is your first name?" --entry) zenity --info --title="Welcome" --text="Mr./Ms. $first" last=$(zenity --title="Your's Last Name" --text "$first what is your last name?" --entry) zenity --info --title="Nice Meeting You" --text="Mr./Ms. $first $last" ~~~ ![](https://img.kancloud.cn/6c/02/6c02e1d82a31b20afdb2420062eecaa2_635x623.png) ## 关于脚本描述 ~~~ #!/bin/bash ~~~ ` `在下面的行中,“first”是一个变量,变量的值在运行时是Generated。 1. 'entry'指的zenity被要求生成一个文本输入框。 2. '--title'定义生成的文本框的标题。 3. '--text='定义了可在文本输入框中的文本。 ~~~ first=$(zenity --title="Your's First Name" --text "What is your first name?" --entry) ~~~ ` `以下脚本文件的这一行用于生成信息(-info)对话框,标题为“欢迎”和文本“Mr./Ms.first”. ~~~ zenity --info --title="Welcome" --text="Mr./Ms. $first" ~~~ ` `脚本的这一行类似于脚本的行号二,除了这里定义了一个新变量“last”。 ~~~ last=$(zenity --title="Your's Last Name" --text "$first what is your last name?" --entry) ~~~ ` `脚本的最后一行再次类似于脚本的第三行,它生成信息对话框,其中包含变量'$ first'和'$ last'。 ~~~ zenity --info --title="Nice Meeting You" --text="Mr./Ms. $first $last" ~~~ ` `有关如何创建一个使用shell脚本自定义对话框的更多信息,请访问下面的参考页**的zenity。** [https://help.gnome.org/users/zenity/stable/](https://help.gnome.org/users/zenity/stable/) ## Zenity 中文手册 要看zenity参数用法,打zenity --help或man zenity Usage: zenity [OPTION...] ### 对话框选项 * --calendar 显示日历对话框 * --entry 显示文字输入栏对话框 * --error 显示错误信息对话框 * --file-selection 显示文件选择对话框 * --info 显示信息对话框 * --list 显示清单对话框 * --progress 显示进度指示窗 * --question 显示提问信息对话框 * --text-info 显示文字资信对话框 * --warning 显示警告信息对话框 ### 一般选项 * --title=标题 指定对话框的标题 * --window-icon=图示路径 指定视窗使用的图示 * --width=宽度 指定宽度 * --height=高度 指定高度 * ### 日历选项 * --text=STRING 指定对话框中的文字 * --day=INT 指定日历中的日期 * --month=INT 指定日历中的月份 * --year=INT 指定日历中的年份 * --date-format=STRING 指定回传的日期格式 ### 文字输入栏选项 * --text=STRING 指定对话框中的文字 * --entry-text=STRING 指定输入栏中的文字 * --hide-text 隐藏输入栏中的文字 ### 错误信息选项 * --text=STRING 指定对话框中的文字 ### 有关文件选择的选项 * --filename=文件名称 指定文件名称 * --multiple 允许同时选择多个文件 * --separator=分隔字符 指定分隔输出结果的字符。 ### 信息选项 * --text=STRING 指定对话框中的文字 ### 清单选项 * --column=STRING 指定栏位标题 * --checklist 第一栏使用独立选择按钮 * --radiolist 第一栏使用多项选择按钮 * --separator=分隔字符 指定分隔输出结果的字符 * --editable 可以更改文字 ### 进度选项 * --text=STRING 指定对话框中的文字 * --percentage=INT 指定开始时的百份比数值 * --pulsate 填满进度列 * --auto-close 当进度达到100% 时关闭对话框 ### 提问选项 * --text=STRING 指定对话框中的文字 ### 文字选项 * --filename=文件名称开启文件 * --editable 可以更改文字 ### 警告信息选项 * --text=STRING 指定对话框中的文字 ### GTK+ 选项 * --gdk-debug=标签 准备设定的gdk 调试标签 * --gdk-no-debug=标签 准备去除的gdk 调试标签 * --display=画面 准备使用的 X 画面 * --sync 进行 X 同步呼叫 * --name=名称 视窗总管所需的程式名称 * --class=类别 视窗总管所需的程式类别名称 * --gxid-host=主机 * --gxid-port=端口号 * --gtk-debug=标签 准备设定的gtk+ 调试标签 * --gtk-no-debug=标签 准备去除的gtk+ 调试验标签 * --g-fatal-warnings 将所有警告信息作为严重错误处理 * --gtk-module=模块 载入额外的 Gtk 模块 ### 其它选项 * --about 关于 zenity * --version 显示版本 ### 求助选项 * -?, --help Show this help message * --usage Display brief usage message ## zenity图形界面之信息对话框和单复选对话框 ``` #!/bin/bash CD="cd" LS="ls" RM="rm" CP="cp" FIND="find" GREP="grep" OTHERS="others" ## 自定义函数1,不传递参数 cdFunction() { ##2,信息对话框 zenity --info --width 300 --height 200 --text="用法:cd (参数),进入到某个目录中,cd ..是返回到上一级目录,cd ../..是返回到上上一级目录,cd(回车) 进入用户主目录,cd ~进入用户主目录,cd -返回进入此目录之前所在的目录,cd !$把上个命令的参数作为cd参数使用。" } lsFunction() { zenity --info --width 300 --height 200 --text="用法:ls (选项) (参数),选项-l,所有输出信息用单列格式输出,不输出为多列,选项-t,用文件和目录的更改时间排序,参数一般为文件或者目录。" } rmFunction() { zenity --info --width 300 --height 200 --text="用法:rm (选项) (参数),选项-f,即使原档案属性设为唯读,也可以删除,无需逐一询问,选项-r,将目录及以下之档案逐一删除。" } cpFunction() { zenity --info --width 300 --height 200 --text="用法:cp (选项) (参数),选项-a,这个选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容,选项-r,若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。" } ## 自定义函数2,传递参数 checkFunction() { declare i if [ $1 == 1 ] then echo $2 else tmp=$2 for((i=0;i<$1;i++)) do str=${tmp%%|*} tmp=${tmp#*|} echo $str done fi } ########## function 1 while((1)) do ##1,列表单选框 select_command=$(zenity --list --radiolist --width 300 --height 400 --text="linux 常见命令" --column="选择" --column="内容列表" TRUE $CD FALSE $LS FALSE $RM FALSE $CP); ## 处理自定义函数的结果 if [ "$select_command" == "$CD" ] then cdFunction elif [ "$select_command" == "$LS" ] then lsFunction elif [ "$select_command" == "$RM" ] then rmFunction elif [ "$select_command" = "$CP" ] then cpFunction else break fi done ########## function 2 while((1)) do ##2,列表复选框 select_option=$(zenity --list --checklist --width 300 --height 400 --text="查找命令" --column="选择" --column="内容列表" FALSE $FIND FALSE $GREP FALSE $LS FALSE $OTHERS); if [ "$select_option" == "$FIND|$GREP|$LS|$OTHERS" ] then checkFunction 4 $select_option elif [ "$select_option" == "$FIND|$GREP|$LS" ] then checkFunction 3 $select_option elif [ "$select_option" == "$FIND|$GREP|$OTHERS" ] then checkFunction 3 $select_option elif [ "$select_option" == "$FIND|$LS|$OTHERS" ] then checkFunction 3 $select_option elif [ "$select_option" == "$GREP|$LS|$OTHERS" ] then checkFunction 3 $select_option elif [ "$select_option" == "$FIND|$GREP" ] then checkFunction 2 $select_option elif [ "$select_option" == "$FIND|$LS" ] then checkFunction 2 $select_option elif [ "$select_option" == "$FIND|$OTHERS" ] then checkFunction 2 $select_option elif [ "$select_option" == "$GREP|$LS" ] then checkFunction 2 $select_option elif [ "$select_option" == "$GREP|$OTHERS" ] then checkFunction 2 $select_option elif [ "$select_option" == "$LS|$OTHERS" ] then checkFunction 2 $select_option elif [ "$select_option" == "$FIND" ] then checkFunction 1 $select_option elif [ "$select_option" == "$GREP" ] then checkFunction 1 $select_option elif [ "$select_option" == "$LS" ] then checkFunction 1 $select_option elif [ "$select_option" == "$OTHERS" ] then checkFunction 1 $select_option else break fi done exit 0 ``` ![](https://img.kancloud.cn/53/bb/53bb9dddba8b5c23cd067ca840e28adc_748x618.png)