Ubuntu Weekly Recipe

第422回 whiptailでCUIをグラフィカルにする

この記事を読むのに必要な時間:およそ 4.5 分

チェックリスト

チェックリストは複数選択可能な選択ボックスです。メニューボックスが一つを選択すれば終了なのに対して,チェックリストではどれを選ぶか,選ばないかを試行錯誤した上で,確定できます。

$ whiptail --title "好きなお菓子" --checklist "あなたが好きなお菓子は?" 0 0 0 \
"きのこの山" "" OFF \
"たけのこの里" "" OFF \
"すぎのこ村" "" OFF \
"コアラのマーチ" "" OFF \
"バームロール" "" OFF \
"ホワイトロリータ" "" ON

チェックリストではタグと項目に加えて,初期状態を示すフラグも指定します。OFFならチェックが外れている状態で,ONならチェックがついています。大文字小文字は区別しません。なお,項目については上記のように""と指定することで省略できます。⁠--noitem」オプションを使うと,""すら不要になります。

標準エラー出力には選択したタグのリストが出力されます。たとえば上記のコマンドで「きのこの山」⁠バームロール」⁠ホワイトロリータ」を選択すると,結果的に以下のような出力になります。

"きのこの山" "バームロール" "ホワイトロリータ"

シェルスクリプト側はこれを受け取って,何が選択されたかを判断します。

図8 平和の象徴「ホワイトロリータ」

画像

ラジオボタン

ラジオボタンは一つしか選択できないチェックリストです。コマンドの使い方はほぼ同じです。ユーザーはどれか一つを選択すると,他の選択項目がOFFになります。

$ whiptail --title "好きなお菓子" --radiolist "あなたが **最も** 好きなお菓子は?" 0 0 0 \
"きのこの山" "" OFF \
"たけのこの里" "" OFF \
"すぎのこ村" "" OFF \
"コアラのマーチ" "" OFF \
"バームロール" "" OFF \
"ホワイトロリータ" "" ON

図9 トロイアの王子パリスをも悩ませる究極の問い

画像

進捗バー

進捗バーは進捗状態にあわせてアニメーションするバーです。また,バーの内側にはパーセンテージの表示も行われます。

アニメーションをさせるためには,継続的に標準入力から進捗状態のパーセンテージを通知する必要があります。さらに数字ではなく「XXXnパーセンテージn文字列nXXX」という文字列を送ると,パーセンテージの更新とともに,パーセンテージの次の行の文字列が,ダイアログの中の文字列で置き換わります。

このあたりは若干ややこしいので実際にやってみると良いでしょう。

$ for i in `seq 0 10 90` `seq 90 -10 0`; do sleep 0.5; \
if [ $i -eq 90 ]; then echo "XXX"; error=1; echo $i; echo "致命的なエラー";echo "XXX"; \
elif [ $i -gt 50 ]; then echo "XXX"; echo $i; \
  if [ "$error" != "1" ]; then echo "おや、いけそう?"; else echo "あっ、あっ、あっ"; fi; echo "XXX"; \
elif [ $i -le 30 ]; then echo "XXX"; echo $i; echo "進捗ダメです。"; echo "XXX"; \
else echo $i; fi; done \
| whiptail --title "進捗どうですか?" --gauge "進捗ダメです。" 0 0 0

whiptailのオプションそのものはシンプルです。最後の数字はパーセンテージの初期値です。

上記をシェルスクリプトとして書き直すと次のようになります。

#!/bin/bash

for i in `seq 0 10 90` `seq 90 -10 0`; do
    sleep 0.5;

    if [ $i -eq 90 ]; then
        echo "XXX"; error=1; echo $i;
        echo "致命的なエラー";echo "XXX";
    elif [ $i -gt 50 ]; then
        echo "XXX"; echo $i;
        if [ "$error" != "1" ]; then
            echo "おや、いけそう?";
        else
            echo "あっ、あっ、あっ";
        fi;
        echo "XXX";
    elif [ $i -le 30 ]; then
        echo "XXX"; echo $i; echo "進捗ダメです。"; echo "XXX"; else echo $i
    fi;
done | whiptail --title "進捗どうですか?" --gauge "進捗ダメです。" 0 0 0

図10 人生には進捗が巻き戻ることだってある

画像

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。