使用 xournal 阅读页数较多的 PDF 文档的最佳方法
GNOME 3 应用程序菜单的定制

使用 Zenity 为命令行程序制作交互界面

Garfileo posted @ 2011年10月25日 09:23 in Linux 的世界 with tags zenity , 14350 阅读

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

  • 无匹配
hit9 说:
2012年2月18日 03:52

这是好东西阿!


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter