Андрей Уваров
В данной статье речь пойдёт о том, каким образом можно без особых усилий
сделать графический интерфейс к shell-скриптам.
Если вы хотите сделать взаимодействие ваших
программ с пользователем более простым, то эта статья для вас, и не важно,
какой язык вы используете, будь то bash, perl, python и т. п.
Итак, Zenity является утилитой отображения
диалогов. Программа имеется в составе большинства распостранённых дистрибутивов
Linux, хотя ее можно скомпилировать или найти уже в бинарном виде практически
для любой *nix-системы.
Взаимодействие с X-сервером производится с
помощью библиотеки GTK+.
Рассмотрим функциональные
возможности данной программы. Имеется десять видов диалогов.
1. Calendar
– календарь (date-picker).
2. Entry –
однострочное текстовое поле ввода.
3. Text-info
– диалог отображения многострочной текстовой информации, который может
применяться и как поле ввода. Хотя, по всей видимости, это не является его
основным назначением.
4. Error –
сообщение об ошибке.
5. Info –
сообщение общего характера.
6. Warning –
предупреждение.
7. Question
– вопросительное сообщение с возможностью ввода утвердительного или
отрицательного ответа.
8. File-selection
– выбор файла.
9. List –
список с возможностью выбора и редактирования его элементов.
10. Progress
– Progress bar dialog. Отображает статус выполнения текущей операции.
Заставить утилиту делать то, что мы пожелаем,
можно посредством запуска программы с соответствующими параметрами. Имя любого
из параметров состоит более чем из одного символа и, следовательно, имеет
префикс «--» – «два минуса». При завершении выполнения будут выведены
результирующие данные в stdout или же код будет просто возвращён в stderr.
Например, чтобы отобразить сообщение об ошибке, достаточно выполнить следующее:
# zenity --error
В результате мы увидим сообщение об ошибке:

Все диалоги имеют некоторые свойства, значения
которых также определяются параметрами запуска. Общие для всех диалогов
свойства, то есть те, которыми обладают все диалоги, такие: title, window-icon,
width, height. Очевидно, что title определяет заголовок окна, window-icon –
пиктограмму, а width и height – ширину и высоту окна соответственно.
Теперь можно поговорить о каждом из диалогов
подробнее.
Info, question, warning и error
Text – выводимое сообщение. Различаются данные диалоги лишь пиктограммой,
находящейся напротив сообщения. Question имеет две кнопки, соответствующие
положительному и отрицательному ответу на сообщение.

Calendar
n Text – сообщение, выводимое над полем выбора
даты.
n Day, month и year – день, месяц и год, которые
будут установлены по умолчанию.
n Date-format – строка, определяющая формат
возвращаемой даты. Формат строки эквивалентен формату вызова функции strftime.
Попробуем написать простое приложение,
запрашивающее дату рождения пользователя.
Файл birthdate.pl:
#! /usr/local/bin/perl
do
print `zenity --info --text
"You may not enter real birth date" --title=birthday`;
while(!($birthdate = `zenity
--calendar --date-format=%d.%m.%y`));
`zenity --info --text "Your
birth date is $birthdate" --title "Your Bitrh Date"`;

Entry
n Text – сообщение, выводимое над полем ввода.
n Entry-text – текст, которым автоматически
заполняется поле ввода.
n Hide-text – если присутствует, то вводимые
символы отображаются «звёздочками».
В качестве примера попробуем написать простое
приложение, осуществляющее запуск вводимой команды.
Файл command.sh:
#! /bin/sh
```zenity --entry --title
"Run command" --text "Command:```

List
n Column – заголовок столбца.
n Check-list – использование check box для
первого столбца.
n Radio-list – использование radio buttons для
первого столбца.
n Separator – разделитель, использующийся при
выводе информации. По умолчанию это символ «|».
n Editable – присутствие данного параметра
означает, что пользователь может редактировать элементы списка.
Text-info
n File-name – имя файла, содержимое которого
будет отображено.
n Editable – использование данного параметра
аналогично List.
File-selection
n File-name – имя файла, устанавливаемое по
умолчанию.
n Multiple – возможность выбора сразу нескольких
файлов.
n Separator – использование данного параметра
аналогично List.
Progress
n Text – сообщение над progress bar.
n Percentage – начальное состояние, указываемое в
процентах.
n Auto-close – автоматическое закрытие диалога
после достижения 100%.
n Pulsate – определяет отображение
«пульсирующего» прогресса.
Кроме того, Zenity имеет ещё
несколько менее важных дополнительных опций.
n --gdk-debug=FLAGS – установка флагов отладки Gdk;
n --gdk-no-debug=FLAGS – отмена флагов отладки Gdk;
n --display=DISPLAY;
n --sync – использование синхронных X-вызовов;
n --name=NAME – имя программы, используемое
оконным менеджером;
n --class=CLASS – класс программы, используемый
оконным менеджером;
n --gxid-host=HOST;
n --gxid-port=PORT;
n --gtk-debug=FLAGS – установка флагов отладки Gtk+;
n --gtk-no-debug=FLAGS – отмена флагов отладки Gtk+;
n --g-fatal-warnings – все предупреждения
приводят к завершению выполнения;
n --gtk-module=MODULE – загрузить дополнительный
модуль Gtk.
Кроме Zenity, есть ещё такие средства, как xdialog,
dialog, kdialog, xmessage. Рассмотрим вкратце некоторые из них.
Dialog – программа, использующая Ncurses
для вывода диалогов. Вследствие этого является достаточно универсальной, так
как не все и не всегда пользуются X-Window. Вот список параметров dialog:
n --yesno <text> <height> <width>
n --msgbox <text> <height> <width>
n --prgbox «<command line>» <height>
<width>
n --infobox <text> <height> <width>
n --inputbox <text> <height> <width>
[<init string>]
n --textbox <file> <height> <width>
n --menu <text> <height> <width>
<menu height> <tag1> <item1>...
n --checklist <text> <height> <width>
<list height> <tag1> <item1> <status1>...
n --radiolist <text> <height> <width>
<list height> <tag1> <item1> <status1>...
n --ftree <file> <FS> <text>
<height> <width> <menu height>
n --tree <FS> <text> <height>
<width> <menu height> <item1>...
Kdialog поставляется в составе KDE. Имеет сходный
интерфейс с dialog и xdialog. Но, на мой взгляд, kdialog более избыточен и
менее функционален, нежели Zenity. Xmessage предназначается исключительно для
вывода сообщений, но внешний вид, думаю, редкого пользователя может порадовать.
Необходимо учесть, что пользователь может и не
иметь установленной Zenity. И не стоит забывать о том, что есть средства, такие
как xdialog, dialog, kdialog, kmessage, и другие. Может быть, в вашем случае
они подойдут больше.