試験運用中なLinux備忘録

2007/07/16

「CLIとGUIの架け橋」zenity

zenityとは、GNOMEデスクトップ環境に含まれるパッケージの1つで、機能としては、GTK+の各種ダイアログを表示し、ユーザの操作によって、出力や戻り値がセットされるというだけのシンプルなものなのだが、コマンドとの組み合わせにより、その便利さが実感できる。

(2008/6/7)Gentoo Linuxの「gnome-light」パッケージには含まれないため、これを指定して入れている場合は、その上に「zenity」パッケージを追加でインストールする形になる。

実行方法

$ zenity [種類指定オプション] ([共通オプション...] [種類固有オプション...])

詳細は

$ zenity --help-all

を参照。

実行例

カレンダー
$ o=$(zenity --calendar --title "日付を指定" --text "日付を指定してください" --date-format="%Y|%m|%d"); echo "戻り値:'$?' 出力:'$o'"
エントリ(1行テキスト入力)
$ o=$(zenity --entry --title "テキスト入力" --text "文字列"); echo "戻り値:'$?' 出力:'$o'"
エラー
$ zenity --error --title "エラー" --text "メッセージ"
情報
$ zenity --info --title "情報" --text "メッセージ"
ファイル選択
$ o=$(zenity --file-selection --title "保存ファイル選択" --save --confirm-overwrite); echo "戻り値:'$?' 出力:'$o'"
$ o=$(zenity --file-selection --title "複数ファイル選択" --multiple); echo "戻り値:'$?' 出力:'$o'"
$ o=$(zenity --file-selection --directory --title=ディレクトリ選択); echo "戻り値:'$?' 出力:'$o'"
リスト選択
$ o=$(zenity --list --title "リスト" --text "質問" --column 項目 "選択肢A" "選択肢B"); echo "戻り値:'$?' 出力:'$o'"
$ o=$(zenity --list --title "リスト" --text "質問" --hide-column 1 --column dummy --column 項目 A "選択肢A" B "選択肢B"); echo "戻り値:'$?' 出力:'$o'"
$ o=$(zenity --list --title "ラジオリスト" --text "質問" --radiolist --hide-column 2 --column 選択 --column dummy --column 項目 true A "選択肢A" false B "選択肢B"); echo "戻り値:'$?' 出力:'$o'"
$ o=$(zenity --list --title "チェックリスト" --text "質問" --checklist --hide-column 2 --column 選択 --column dummy --column 項目 false A "選択肢A" false B "選択肢B"); echo "戻り値:'$?' 出力:'$o'"
進行状況バー

パーセンテージの数字を標準入力から受け取ることでバーを制御する。--pulsateオプションは、進行状況が分からないときに使用し、標準入力から文字が出力されると動き出す。

端末にも出力をするため、teeコマンドを使用している。端末に出す必要のない場合は直接パイプでつなげてよい。

$ for ((i = 0; i < 100; i += 10)); do echo $i; sleep 0.5; done | tee >(zenity --progress --text "経過の表示")
$ for ((i = 0; i < 100; i += 10)); do echo $i; sleep 0.5; done | zenity --progress --text "経過の表示"
$ for ((i = 0; i < 100; i += 10)); do echo "dummy"; sleep 0.5; done | tee >(zenity --progress --text "経過の表示" --pulsate --auto-close)
$ wget -c [URL] 2>&1 | sed -u 's/.* \+\([0-9]\+%\).*$/\1/' | tee >(zenity --progress --title "ダウンロードの状態" --text "ダウンロード中...")

wgetの例では、sed-uオプションを使い、数字データをzenityへ次々と流している。

質問
$ o=$(zenity --question --title "2択質問" --text "質問内容"); echo "戻り値:'$?' 出力:'$o'"
警告

(2007/10/26)バージョン2.18と2.20では、質問ではなく「情報」のアイコン違い版となっていて、OKボタンのみ。

$ o=$(zenity --warning --title "警告" --text "メッセージ"); echo "戻り値:'$?' 出力:'$o'"
数字のつまみによる値の指定

(2007/10/26)「質問(警告)」の場所にあったのを修正

$ o=$(zenity --scale --title "値の指定" --text "文字列" --value 0 --min-value -50 --max-value 50); echo "戻り値:'$?' 出力:'$o'"
テキストデータの表示

ここでも、端末にも出力を出すために、teeコマンドを使用している。

$ dmesg | tee >(zenity --text-info --title "テキスト" --width=500 --height=300)
通知

通知機能を提供するlibnotifyがインストールされていて、かつ、この機能を有効にしてビルドされた場合にのみ使える。

も参照。

exec 3> >(zenity --notification --window-icon /usr/share/pixmaps/xxx.png --text テスト --listen)

でシステムトレイに入り、マウスを乗せると指定した文字列を表示する。

メッセージを吹き出し(バルーン)で出力するには

echo "message: [メッセージ]" >&3

下のようにすると斜体になる。同様に、「s」「u」「big」「small」なども使える。

echo "message: <i>[メッセージ]</i>" >&3

マウスを乗せたときに表示する文字列(ツールチップ)を変更するには

echo "tooltip: [新しい文字列]" >&3

アイコンを変更するには

echo "icon: [アイコンの場所]" >&3

非表示/表示の切り替えは

echo "visible: [true(表示)かfalse(非表示)]" >&3

終了するには

exec 3>&-

注意点としては、execをした(擬似/仮想)端末の中でないとコマンドが送れない。シェルスクリプトの中で「exec 3> >(zenity --notification --listen」した後、現在の端末でコマンドを送りたい場合は「.」や「source」でシェルスクリプトを実行する。

実際に使用する場合は、何かを処理するシェルスクリプトの中で起動させ、その状況を文字列に出力したり、バルーンに出したりしながら処理を行い、終了したときに閉じるような形になりそう。

関連記事:

関連URL:

使用したバージョン:

  • zenity 2.16.3(USE=-debug libnotify)

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

(C) 2007-2015 kakurasan
本ウェブログの表示につきましては、横幅1,000ピクセル以上を推奨します。