使用 Zenity 为命令行程序制作交互界面
GNOME 项目为命令行程序以及 Shell 脚本程序提供了一套对话框交互工具,即 Zenity [1],可将用户输入转化为标准输出。命令行程序可从 Zenity 的标准输出中获取有用的信息,用于组织命令行程序选项参数。KDE 桌面项目也有类似的工具——KDialog。本文以 Cikada 程序 [2] 的用户交互界面制作为例,介绍一下 Zenity 的基本用法。
命令行程序参数分析
Cikada 程序可接受三个参数的输入,命令格式如下:
$ cikada -s 9999 -f filename.pdf
其中,『-s』需要配备整型数值;『-f』参数是一个开关,若该参数存在则开启 Cikada 的全屏模式,若否则Cikada 则进入窗口模式。『filename.pdf』参数是 Cikada 所接受的文件名。
如果我们要为这三个参数选择相应的 Zenity 对话框类型,那么:
- 『-s』参数应当对应文本框对话框,用户可在文本框中输入『-s』所需的整型数值;
- 『-f』参数应当对应一个询问类型的消息框,用户可点击『OK』或者『Cancel』按扭来决定『-f』参数是否存在;
- 『filename.pdf』参数自然是要对应文件选择对话框。
文件选择对话框的用法
看下面的 Bash 脚本:
PDF_DOC=$(zenity --file-selection --title="选择 PDF 文档") if [ "${PDF_DOC##*.}" != "pdf" ] then zenity --error --text="呃,你确定你选择的是一份 PDF 文档?" exit 1 fi
其中,『zenity --file-selection --title="选择 PDF 文档"』便可开启 Zenity 的文件选择对话框,如下图所示。
用户在文件选择对话框中选定文件,在点击『OK』键确定时,所选文件的路径信息作为系统标准输出(文件描述符为 1),如果我们使用『PDF_DOC』这个 Bash 变量获取这一输出,那么 『PDF_DOC』便是所选文件的路径字串。然后,使用 Bash 的字串截取操作『"${PDF_DOC##*.}"』截取文件的扩展名,通过与『.pdf』字串相等测试,判断所选文件是否为 PDF 文档。如果所选文件并非 PDF 文档,那么则调用 Zenity 的错误消息框作为提醒,并让脚本程序退出。
文本输入框的用法
文本输入框的用法类似文件选择对话框,也是利用 Bash 变量获取对话框的标准输出并进行字串测试以确定相应的处理方式。见下面代码:
SEGMENT_LENGTH=$(zenity --entry --title="设置缓冲页面数量" --text="输入页数" --entry-text="3") if [ "$SEGMENT_LENGTH" = "" ] then SEGMENT_LENGTH=3 fi
其中,『zenity --entry --title="设置缓冲页面数量" --text="输入页数" --entry-text="3"』可开启文本输入框,如下图所示。
如果未输入数值或者点击了文本输入框的『Cancel』按扭,上述 Bash 脚本会将『SEGMENT_LENGTH』变量设定默认值为 3。
询问框的用法
见下面代码:
zenity --question --text="全屏显示?" if [ $? = 0 ] then FULLSCREEN="-f" else FULLSCREEN="" fi
其中『zenity --question --text="全屏显示?"』可开启如下图所示的对话框。
询问对话框没有提供系统的标准输出,所以我们只能判断『zenity --question --text="全屏显示?"』的返回值来确定用户是点击了『Yes』还是『No』按扭。在 Bash 中,上一次程序运行的返回值可使用『$?』来访问。
对于『zenity --question --text="全屏显示?"』,如果『$?』的值为 0 那么表示程序运行成功,即用户点击了『Yes』按扭,此时将『FULLSCREEN』变量的值设为『-f』;否则表示用户点击了『No』按扭或窗口关闭按扭,此时,『FULLSCREEN』变量的值设为空。
命令行程序的启动
上述过程使用了三种 Zenity 对话框,主要工作就是收集 Cikada 程序运行时所需参数。一旦获得了这些参数,那么便可以调用 Cikada 程序了,如下:
cikada -s ${SEGMENT_LENGTH} ${FULLSCREEN} ${PDF_DOC}
完整的 Bash 脚本
#!/bin/env bash PDF_DOC=$(zenity --file-selection --title="选择 PDF 文档") if [ "${PDF_DOC##*.}" != "pdf" ] then zenity --error --text="呃,你确定你选择的是一份 PDF 文档?" exit 1 fi SEGMENT_LENGTH=$(zenity --entry --title="设置缓冲页面数量" \ --text="输入页数" --entry-text="3") if [ "$SEGMENT_LENGTH" = "" ] then SEGMENT_LENGTH=3 fi zenity --question --text="全屏显示?" if [ $? = 0 ] then FULLSCREEN="-f" else FULLSCREEN="" fi # 开启 Cikada cikada -s ${SEGMENT_LENGTH} ${FULLSCREEN} ${PDF_DOC}
参考资料
[1] Zenity 使用手册: http://library.gnome.org/users/zenity/stable/index.html.zh_CN
[2] Cikada 项目:https://github.com/liyanrui/cikada
转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com
2012年2月18日 03:52
这是好东西阿!