Взаимодействие shell-скриптов с пользователем посредством Zenity
В данной статье речь пойдёт о том, каким образом можно без особых усилий
сделать графический интерфейс к 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
* Text - сообщение, выводимое над полем выбора даты.
* Day, month и year - день, месяц и год, которые будут установлены по умолчанию.
* Date-format - строка, определяющая формат возвращаемой даты. Формат строки эквивалентен формату вызова функции strftime.
Попробуем написать простое приложение, запрашивающее дату рождения пользователя.
-----8<-----
#! /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"`;
-----8<-----
Entry
* Text - сообщение, выводимое над полем ввода.
* Entry-text - текст, которым автоматически заполняется поле ввода.
* Hide-text - если присутствует, то вводимые символы отображаются «звёздочками».
В качестве примера попробуем написать простое приложение, осуществляющее запуск вводимой команды.
-----8<-----
#! /bin/sh
```zenity --entry --title "Run command" --text "Command:```
-----8<-----
List
* Column - заголовок столбца.
* Check-list - использование check box для первого столбца.
* Radio-list - использование radio buttons для первого столбца.
* Separator - разделитель, использующийся при выводе информации. По умолчанию это символ «|».
* Editable - присутствие данного параметра означает, что пользователь может редактировать элементы списка.
Text-info
* File-name - имя файла, содержимое которого будет отображено.
* Editable - использование данного параметра аналогично List.
File-selection
* File-name - имя файла, устанавливаемое по умолчанию.
* Multiple - возможность выбора сразу нескольких файлов.
* Separator - использование данного параметра аналогично List.
Progress
* Text - сообщение над progress bar.
* Percentage - начальное состояние, указываемое в процентах.
* Auto-close - автоматическое закрытие диалога после достижения 100%.
* Pulsate - определяет отображение «пульсирующего» прогресса.
Кроме того, Zenity имеет ещё несколько менее важных дополнительных опций.
* --gdk-debug=FLAGS - установка флагов отладки Gdk;
* --gdk-no-debug=FLAGS - отмена флагов отладки Gdk;
* --display=DISPLAY;
* --sync - использование синхронных X-вызовов;
* --name=NAME - имя программы, используемое оконным менеджером;
* --class=CLASS - класс программы, используемый оконным менеджером;
* --gxid-host=HOST;
* --gxid-port=PORT;
* --gtk-debug=FLAGS - установка флагов отладки Gtk+;
* --gtk-no-debug=FLAGS - отмена флагов отладки Gtk+;
* --g-fatal-warnings - все предупреждения приводят к завершению выполнения;
* --gtk-module=MODULE - загрузить дополнительный модуль Gtk.
Кроме Zenity, есть ещё такие средства, как xdialog, dialog, kdialog, xmessage. Рассмотрим вкратце некоторые из них.
Dialog - программа, использующая Ncurses для вывода диалогов. Вследствие этого является достаточно универсальной, так как не все и не всегда пользуются X-Window.
Вот список параметров dialog:
* --yesno
* --msgbox
* --prgbox «»
* --infobox
* --inputbox []
* --textbox
* --menu ...
* --checklist ...
* --radiolist ...
* --ftree
* --tree ...
Kdialog поставляется в составе KDE. Имеет сходный интерфейс с dialog и xdialog. Но, на мой взгляд, kdialog более избыточен и менее функционален, нежели Zenity. Xmessage предназначается исключительно для вывода сообщений, но внешний вид, думаю, редкого пользователя может порадовать.
Необходимо учесть, что пользователь может и не иметь установленной Zenity. И не стоит забывать о том, что есть средства, такие как xdialog, dialog, kdialog, kmessage, и другие. Может быть, в вашем случае они подойдут больше.