05 November 2018

LinuxスクリプトでGUIダイアログ(gdialog, zenity, yad)

Linuxスクリプトで、ユーザ入力などGUIダイアログを表示したい場合の記述方法のメモ

マニュアル

・gdialogソースコード https://stuff.mit.edu/afs/sipb/project/gtt/build/i386_linux24/gnome-utils/gdialog/
・zenityマニュアル https://help.gnome.org/users/zenity/
・yad manpage http://manpages.ubuntu.com/manpages/cosmic/man1/yad.1.html

情報表示

20181105-info.jpg

gdialogの場合は、ダイアログの幅・高さは無視されるので、0, 0 を記述している。

gdialog --title "情報表示ダイアログ" --infobox "表示するメッセージ" 0 0
gdialog --title "情報表示ダイアログ" --msgbox "表示するメッセージ" 0 0

zenityの場合

zenity --info --title="情報表示ダイアログ" --text="表示するメッセージ" 2>/dev/null

yadの場合

yad --image "gtk-dialog-info" --button=gtk-ok:0 \
    --title="情報表示ダイアログ" --text="表示するメッセージ" 2>/dev/null

アイコンやボタンのリソース名は、 https://developer.gnome.org/gtk3/stable/gtk3-Stock-Items.html を参照

警告表示

20181105-warning.jpg

zenityの場合

zenity --warning --title="警告表示ダイアログ" --text="表示するメッセージ" 2>/dev/null

yadの場合

yad --image "gtk-dialog-warning" --button=gtk-ok:0 \
    --title="警告表示ダイアログ" --text="表示するメッセージ" 2>/dev/null

エラー表示

20181105-error.jpg

zenityの場合

zenity --error --title="エラー表示ダイアログ" --text="表示するメッセージ" 2>/dev/null

yadの場合

yad --image "gtk-dialog-error" --button=gtk-cancel:0 \
    --title="エラー表示ダイアログ" --text="表示するメッセージ" 2>/dev/null

YES / NO 選択ダイアログ

20181105-yesno.jpg

gdialogの場合は、ダイアログの幅・高さは無視されるので、0, 0 を記述している。プログラムの終了コード(EXITCODE)は、YESの場合は 0 、NOの場合は 1 となる。

gdialog --title "YES/NO選択ダイアログ" --yesno "表示するメッセージ" 0 0
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"

zenityの場合

zenity --question --title="YES/NO選択ダイアログ" --text="表示するメッセージ" 2>/dev/null
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"

yadの場合

yad --image "gtk-dialog-question" --button=gtk-yes:0 --button=gtk-no:1 \
    --title="YES/NO選択ダイアログ" --text="表示するメッセージ" 2>/dev/null
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"

テキスト入力ダイアログ

20181105-entry.jpg

gdialogの場合。プログラム終了コード(EXITCODE)は、OKの場合は 0、キャンセルの場合は 1 が返る。入力された文字列は、標準エラー出力に返されるので、これを標準出力にリダイレクトして変数に代入する。

VALUE=$(gdialog --title "テキスト入力ダイアログ" \
    --inputbox "表示するメッセージ" 0 0 "入力 初期値" 2>&1)
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"
echo "VALUE=$VALUE"

zenityの場合。widthでダイアログの幅を指定できるが、テキストエリアは大きくならないバグ(特性?)がある。

VALUE=$(zenity --entry --width=400 --title="テキスト入力ダイアログ" \
    --text="メッセージ文\n何か入力してください" --entry-text="入力 初期値" 2>/dev/null)
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"
echo "VALUE=$VALUE"

yadの場合

VALUE=$(yad --entry --width=400 --title="テキスト入力ダイアログ" \
    --text="メッセージ文\n何か入力してください" --entry-text="入力 初期値" 2>/dev/null)
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"
echo "VALUE=$VALUE"

カレンダー入力ダイアログ

20181105-calendar.jpg

gdialogにカレンダー入力ダイアログは存在しない。

zenityの場合。選択された年月日を、cutコマンドで切り分けて変数に格納している。

VALUE=$(zenity --calendar --width=400 --title="カレンダー入力ダイアログ" \
    --text="日付を選択します" --date-format=%Y-%m-%d 2>/dev/null)
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"
 
YEAR=$(echo $VALUE|cut -c 1-4)
MONTH=$(echo $VALUE|cut -c 6-7)
DAY=$(echo $VALUE|cut -c 9-10)
echo "YEAR=$YEAR"
echo "MONTH=$MONTH"
echo "DAY=$DAY"

yadの場合

VALUE=$(zenity --calendar --width=400 --title="カレンダー入力ダイアログ" \
    --text="日付を選択します" --date-format=%Y-%m-%d 2>/dev/null)
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"
 
YEAR=$(echo $VALUE|cut -c 1-4)
MONTH=$(echo $VALUE|cut -c 6-7)
DAY=$(echo $VALUE|cut -c 9-10)
echo "YEAR=$YEAR"
echo "MONTH=$MONTH"
echo "DAY=$DAY"

リスト選択ダイアログ

20181105-list.jpg

zenityの場合。ダイアログで選択された行は、print-columnで指定されたカラムのデータで返される。

VALUE=$(zenity --list --title="リストから選択させるダイアログ" --text="1つ選択してください" \
    --width=400 --height=200 \
    --print-column=1 \
    --column=ID --column="県" --column="県庁所在地" \
    1 "北海道" "札幌市" \
    2 "青森県" "青森市" \
    3 "岩手県" "盛岡市" \
    4 "秋田県" "秋田市" 2>/dev/null)
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"
echo "VALUE=$VALUE"

yadの場合。データの文字の後に、セパレーターが出力されてしまう(バグがある?)ため、separator設定でNULL文字列を指定しておく

VALUE=$(yad --list --title="リストから選択させるダイアログ" --text="1つ選択してください" \
    --width=400 --height=200 \
    --print-column=1 --separator= \
    --column=ID --column="県" --column="県庁所在地" \
    1 "北海道" "札幌市" \
    2 "青森県" "青森市" \
    3 "岩手県" "盛岡市" \
    4 "秋田県" "秋田市" 2>/dev/null)
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"
echo "VALUE=$VALUE"

テキストファイル表示ダイアログ

20181105-text.jpg

gdialogの場合。フォントが指定できない制限がある。ダイアログの高さ・幅の設定が可能で、単位は文字単位のようだ。下の例では、横サイズは80文字分と言う意味。

ls -lA ~/ > /tmp/temp01.txt
gdialog --title "テキスト表示ダイアログ" --textbox "/tmp/temp01.txt" 50 80
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"

zenityの場合

ls -lA ~/ > /tmp/temp01.txt
zenity --text-info --width=400 --height=200 --title="テキスト表示ダイアログ" \
    --filename="/tmp/temp01.txt" --font=Mono 2>/dev/null
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"

yadの場合

ls -lA ~/ > /tmp/temp01.txt
yad --text-info --width=400 --height=200 --title="テキスト表示ダイアログ" \
    --filename="/tmp/temp01.txt"  --fontname=Monospace 2>/dev/null
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"

スケール入力ダイアログ

20181105-scale.jpg

zenityの場合。

VALUE=$(zenity --scale --title="スケール入力ダイアログ" \
    --text="スライダーで値を調整できます\nキーボードでのみstep設定が有効" \
    --min-value=-100 --max-value=100 --step=5 2>/dev/null)
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"

yadの場合

VALUE=$(yad --scale --title="yad スケール入力ダイアログ" \
    --text="スライダーで値を調整できます\nキーボードでのみstep設定が有効" \
    --min-value=-100 --max-value=100 --value=0 --step=5 2>/dev/null)
 
EXITCODE=$?
echo "EXITCODE=$EXITCODE"