使用shell腳本時,經常會出現用戶與腳本交互的時候,一般我們都是通過在終端內完成交互,也就是全字符界面。但今天重裝系統時順便寫了個自動備份與恢復的腳本(還沒寫完),因為我是在desktop下執行的腳本,突然想用一下GUI界面做交互,這樣看起來不用那么原始。所以就有了此文。
1. Zenity
第一個介紹的工具就是Zenity,它是Gnome下的一個項目(大概),在大部分發行版中都自動安裝了這個工具,因此你可以直接使用。
1. 日歷
使用 --calendar 選項來創建日歷對話框。Zenity 在標準輸出中返回選定的日期。如果沒有在命令行指定日期,就使用當前日期。
日歷對話框支持以下選項:
--text= 文本
指定日歷對話框里顯示的文本。
--day= 天
指定日歷對話框中的日子。天必須是介于 1~31 之間的數字。
--month= 月份
指定日歷對話框中的月份。月份必須是介于 1~12 之間的數字。
--year= 年
指定日歷對話框中的年份。
--date-format= 格式
指定選定的日期返回時的樣式。默認的格式取決于您的區域設置。格式必須可以被 strftime 函數接受,例如 %A %d/%m/%y
。
下面的腳本示范了如何創建一個日歷對話框:
zenity --calendar \
--title="選擇日期" \
--text="通過點擊選擇日期。" \
--day=21 --month=01 --year=2016
上面是一個默認日期,如圖:
默認返回的是系統格式,你可以使用--date-format格式化,見上面。
2. 文件選擇
使用 --file-selection 選項創建一個文件選擇對話框。Zenity 在標準輸出返回選中的文件或目錄。默認的文件選擇對話框模式是打開對話框。
文件選擇對話框支持以下選項:
--filename= 文件名
指定文件選擇對話框在第一次顯示時,選定的文件或文件夾。
--multiple
允許在文件選擇對話框里選中多個文件名。
--directory
在文件選擇對話框里只允許選中文件夾。
--save
設置文件選擇對話框模式為保存對話框。
--separator= 分隔符
指定用于分隔返回的文件名列表的字符。
下面示范了如何創建一個文件選擇對話框:
FILE=`zenity --file-selection --title="選擇文件"`
case $? in
0)
echo "$FILE 被選中。";;
1)
echo "沒有選擇文件。";;
-1)
echo "發生意外錯誤。";;
esac
界面如下:
3. 表單
使用 --forms 選項創建一個表單對話框。
表單對話框支持以下選項:
--add-entry= 字段名稱
在表單對話框中添加新的輸入框。
--add-password= 字段名
在表格對話框中輸入新的密碼輸入框。(隱藏文本)
--add-calendar= 字段名稱
在表格對話框中添加新日歷。
--text= 文本
設置對話框文本。
--separator= 分隔符
設置輸出分隔符字符。(默認:|)
--forms-date-format= 格式
設置返回日期的格式。默認的格式取決于您的區域設置。格式必須可以被 strftime 函數接受,例如 %A %d/%m/%y
。
下面的腳本示范了如何創建一個表單對話框:
zenity --forms --title="添加好友" \
--text="輸入您朋友的信息。" \
--separator="," \
--add-entry="名" \
--add-entry="姓" \
--add-entry="郵件" \
--add-calendar="生日" >> addr.csv
截圖如下:
看一下保存的文件:
$ cat addr.csv
xx,aa,ss,2017年01月21日
4. 列表
使用 --list 選項創建一個列表對話框,Zenity 在標準輸出返回選中行的第一列項目。
對話框里的數據必須指定行和列,可以由標準輸入提供,每一項都必須由換行符分隔。
如果您使用--checklist
或 --radiolist
選項,每一行必須以 “TRUE” 或 “FALSE” 開始。
列表框支持以下選項:
--column= 列
指定列表對話框顯示的列標題。您必須為每個要顯示的列,用 --column 選項指定一個列標題。
--checklist
指定列表框的第一列包含一個復選框。
--radiolist
指定列表框的第一列包含單選按鈕。
--editable
指定顯示的項可以編輯。
--separator= 分隔符
指定列表框返回選中項時使用的字符。
--print-column= 列
指定選擇列上顯示什么,默認是 “1”,“ALL” 用于在列表上顯示所有列。
下面的例子顯示腳本如何創建一個列表對話框:
zenity --list \
--title="選擇您想查看的 Bugs" \
--column="Bug 編號" --column="嚴重" --column="描述" \
992383 Normal "多選時 GtkTreeView 崩潰" \
293823 High "GNOME 字典不能使用代理" \
393823 Critical "菜單編輯器在 GNOME 2.0 中不能運行"
截圖:
通常需要指定窗口寬高:
--height="600"
--width="1000"
5. 通知圖標
使用 --notification
選項創建一個通知對話框。
--text= 文本
指定在通知區域顯示的文本。
--listen=icon: 'text', message:'text', tooltip:'text', visible:'text',
使用 --listen 執行輸入監聽。
下面的腳本示范了如何創建一個通知區域圖標:
zenity --notification --listen
message: this is the message text
6. 消息
對于每一種類型,使用 --text 選項來指定在對話框里顯示的文本。
- 6.1 錯誤
使用 --error 選項創建一個錯誤對話框。
下面示范了如何創建一個錯誤對話框:
zenity --error \
--text="找不到 /var/log/syslog。"
- 6.2 信息
使用 --info 選項創建一個信息對話框。
下面示范了如何創建一個信息對話框:
zenity --info \
--text="合并完成。更新了 3 / 10 個文件。"
- 6.3 問題
使用 --question 選項創建一個問題對話框。
下面的腳本示范了如何創建一個問題對話框:
zenity --question \
--text="您確認要繼續嗎?"
- 6.4 警告
使用 --warning 選項創建一個警告對話框。
下面的腳本示范了如何創建一個警告對話框:
zenity --warning \
--text="拔下電源線,避免觸電。"
7. 密碼輸入
使用 --password
選項創建一個口令對話框。
口令輸入對話框支持以下選項:
--username
顯示用戶名字段。
下面的腳本示范了如何創建一個口令輸入對話框:
#!/bin/sh
ENTRY=`zenity --password --username`
case $? in
0)
echo "用戶名: `echo $ENTRY | cut -d'|' -f1`"
echo "密碼: `echo $ENTRY | cut -d'|' -f2`"
;;
1)
echo "停止登陸。";;
-1)
echo "發生意外錯誤。";;
esac
截圖如下:
8. 進度
使用 --progress
選項創建一個進度對話框。
Zenity 從標準輸入一行行讀取數據。如果某一行以 # 開頭,進度框里的文本會被那一行上的文本替換,如果某一行只是一個數字,數字會被換成進度條的百分比。
進度框支持以下選項:
--text= 文本
指定顯示在進度框里的文本。
--percentage= 百分比
指定進度框開始時的百分比設定。
--auto-close
當達到 100% 時自動關閉對話框。
--pulsate
指定進度條跳動,直到從標準輸入讀到一個 EOF 文件結束符。
下面的腳本示范了如何創建一個進度對話框:
#!/bin/sh
(
echo "10" ; sleep 1
echo "# 更新郵件日志" ; sleep 1
echo "20" ; sleep 1
echo "# 復位定時計劃任務" ; sleep 1
echo "50" ; sleep 1
echo "該行會被忽略" ; sleep 1
echo "75" ; sleep 1
echo "# 重啟系統" ; sleep 1
echo "100" ; sleep 1
) |
zenity --progress \
--title="更新系統日志" \
--text="掃描郵件日志..." \
--percentage=0
if [ "$?" = -1 ] ; then
zenity --error \
--text="更新被取消。"
fi
可以設置百分比:
9. 文本輸入
使用 --entry
選項創建一個文本輸入對話框。Zenity 將文本框的內容返回到標準輸出。
文本輸入框支持以下選項:
--text= 文本
指定在文本輸入框中顯示的文本。
--entry-text= 文本
指定在文本框的文本域里顯示的文本。
--hide-text
隱藏文本框中輸入的字段內容。
下面示范了如何創建一個文本輸入對話框:
zenity --entry \
--title="添加新配置" \
--text="輸入新配置的名稱:" \
--entry-text "新配置"
截圖如下:
10. 文本信息
使用 --text-info
選項來創建一個文本信息框。
文本信息框支持以下選項:
--filename= 文件名
指定一個加載到文本信息框里的文件。
--editable
顯示的文本允許編輯,當對話框關閉后,編輯后的文本顯示到顯示器上。
--font= 字體
指定文本字體。
--checkbox= 文本
啟用復選框,如 “我已閱讀并接受該條款?!?br>
--html
啟用 html 支持。
--url= 網址
設置一個網址,而不是文件。只有當您使用 --html 選項時才有效。
下面的腳本示范了如何創建一個文本信息對話框:
#!/bin/sh
# 腳本目錄下必須要有一個名為"COPYING"的文件。
FILE=`dirname $0`/COPYING
zenity --text-info \
--title="License" \
--filename=$FILE \
--checkbox="我同意該協議。"
使用$?可以判斷輸入的結果。
11. 范圍
使用 --scale
選項創建一個范圍對話框。
范圍對話框支持以下選項:
--text= 文本
設置對話框文本。(默認:調整范圍值)
--value= 值
設置初始值。(默認:0) 您必須在最小值和最大值之間指定一個值。
--min-value= 值
設置最小值。(默認:0)
--max-value= 值
設置最大值。(默認:100)
--step= 值
設置步長。(默認:1)
--print-partial
將值打印為標準輸出,無論值何時變化。
--hide-value
隱藏對話框中的值。
下面的腳本示范了如何創建一個范圍對話框:
#!/bin/sh
VALUE=`zenity --scale --text="選擇窗口透明度。" --value=50`
case $? in
0)
echo "您選中了 $VALUE%。";;
1)
echo "未選中值。";;
-1)
echo "發生意外錯誤。";;
esac
12. 顏色選擇
使用 --color-selection
選項創建一個顏色選擇對話框。
顏色選擇對話框支持以下選項:
--color= 值
設置初始顏色。(例如:#FF0000)
--show-palette
顯示調色板。
下面的腳本示范了如何創建一個顏色選擇對話框:
#!/bin/sh
COLOR=`zenity --color-selection --show-palette`
case $? in
0)
echo "您選擇了 $COLOR。";;
1)
echo "未選擇顏色。";;
-1)
echo "發生意外錯誤。";;
esac
![示例圖片]
2. KDialog
上面介紹的是Gnome項目下的工具,同樣的,Kde項目下同樣也有這樣的工具,用法更加豐富,不過即便是kde桌面的發行版,也自帶了zenity工具因此只需要使用一個就可以了。