unit="секунд"
while test $left != 0
do
$DIALOG --sleep 1 \
--title "INFO BOX" \
--infobox "Это информационный бокс. Он отличается от \
msgbox тем, что не ждёт, пока пользователь нажмет Enter, \
а прекращает работу по истечении времени \
(в данном примере - 10 секунд). \
У вас $left $unit чтобы прочитать это сообщение..." 10 52
left=`expr $left — 1`
test $left = 1 && unit="second"
done
Параметр
--sleep 1
означает, что программа dialog
будет перерисовывать окно через одну секунду. Параметр --title
задает заголовок виджита, --infobox
— определяет тип виджита, после определения виджита следует отображаемое сообщение, а потом — размер виджита.В цикле while мы проверяем, сколько секунд осталось, уменьшая значение переменной left.
25.3. Виджит Yes-no
Часто встречаются диалоговые окна, спрашивающие пользователя, согласен ли он с действиями программы, например, «Вы точно хотите выйти?» или «Удалить этот файл?». Пользователю же предлагается два варианта ответа — Да или Нет. Для организации такого диалога предназначен виджит yes-no.
Следующий листинг демонстрирует работу с этим виджитом:
Листинг 25.3. Работа с виджитом yes-no
#!/bin/sh
DIALOG=${DIALOG=dialog}
$DIALOG --title "YES/NO BOX" --clear \
--yesno "Отформатировать /dev/hda1?" 5 41
case $? in
0)
echo "Да.";;
1)
echo "Нет.";;
255)
echo "ESC.";;
esac
Рис. 25.2. Виджит yes-no
Виджит используется так же, как и предыдущие: название виджита (yesno), текстовое сообщение, размеры виджита. Программа dialog возвращает следующие значения:
♦ 0, если пользователь нажал кнопку Yes;
♦ 1, если пользователь нажал кнопку No;
♦ 255, если пользователь нажал клавишу Esc.
25.4. Окно ввода текста
Следующим по частоте применения после информационных виджитов и виджита yes-no следует виджит ввода текстовой информации — Inputbox. Принцип работы данного виджита следующий:
♦ Мы определяем имя временного файла, в который будет записано введенное пользователем сообщение.
♦ Вызываем программу
dialog
с параметром --inputbox
.♦ Перенаправляем вывод программы во временный файл (программа выведет введенное пользователем значение).
♦ Выводим или обрабатываем каким-либо другим способом содержимое временного файла.
Листинг 25.4. Виджит Inputbox
#!/bin/sh
DIALOG=${DIALOG=dialog}
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap "rm -f $tempfile" 0 1 2 5 15
$DIALOG --title "INPUT BOX" --clear \
--inputbox "Данный виджит используется для ввода \
информации \n\n \
Введите свое имя:" 16 51 2 > $tempfile
retval=$?
case $retval in
0)
echo "Вы ввели `cat $tempfile`";;
1)
echo "Нажата Cancel";;
255)
if test -s $tempfile ; then
cat $tempfile
else
echo "Нажата ESC."
fi
;;
esac
Рис. 25.3. Виджит InputBox
Значения, возвращаемые программой
dialog
:♦ 0, если пользователь что-то ввел и нажал Enter или просто нажал <Ввод>, не введя ничего (тогда временный файл будет пуст);
♦ 1, если пользователь нажал Cancel;
♦ 255, если пользователь нажал Esc.
25.5. Зависимые и независимые переключатели
Программа
dialog
позволяет вам использовать в своих сценариях зависимые и независимые переключатели. Зависимые переключатели реализуются виджитом radiolist, а независимые — checklist.Листинг 25.5. Независимые переключатели
#!/bin/sh
DIALOG=${DIALOG=dialog}
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap "rm -f $tempfile" 0 1 2 5 15
$DIALOG --backtitle "Пример" \
--title "Независимые переключатели" \
--checklist "Данный пример демонстрирует работу независимых \n\
переключателей, реализуемых с помощью пакета Dialog \n\
Используйте ПРОБЕЛ для включения или выключения переключателей.\
\n\n\
Какие произведения вы читали?" 20 61 5 \
"Почти как люди" "Саймак" off \
"Фауст" "Гете" ON \
"Мастер и Маргарита" "Булгаков" off \
"Мир теней" "Саймак" off \
"Демон" "Лермонтов" on 2> $tempfile
retval=$?
choice=`cat $tempfile`
case $retval in
0)
echo "Вы выбрали '$choice'";;
1)
echo "Нажата Cancel";;
255)
echo "Нажата ESC";;
esac
Рис. 25.4. Независимые переключатели
Выбранные пользователем значения помещаются во временный файл, который вам нужно будет обработать. Сейчас мы просто выведем его на консоль. Элемент списка checklist может находиться в одном из положений — On или Off. Эти значения не чувствительны к регистру. Во временный файл выводятся только включенные переключатели.
Работа с виджитом radiolist осуществляется так же, как и в виджитом checklist, за исключением того, что может быть активным лишь один элемент и во временный файл будет записан именно этот элемент.
Листинг 25.6. Зависимые переключатели
#!/bin/sh
DIALOG=${DIALOG=dialog}
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap 'rm -f $tempfile" 0 1 2 5 15
$DIALOG --backtitle "Пример" \
--title "RADIOLIST BOX" --clear \
--radiolist "Это список зависимых переключателей \n\
Он позволяет выбрать только один вариант из списка \n\
Какую из этих книг вы читали последней?" 2 0 81 5 \
"Почти как люди" "Саймак" off \
"Фауст" "Гете" off \
"Мастер и Маргарита" "Булгаков" ON \
"Мир теней" "Саймак" off \
"Демон" "Лермонтов" on 2> $tempfile
retval=$?
choice=`cat $tempfile`
case $retval in
0)
echo "Вы выбрали '$choice'";;
1)
echo "Нажата Cancel";;
255)
echo "Нажата ESC";;
esac
25.6. Организация меню
Виджит MenuBox очень похож на radiolist — они прямо-таки братья-близнецы, только у menubox нет слева переключателя включено/выключено. Использовать MenuBox нужно так же, как и radiolist, но не указывая on или off для элементов меню.