Gtkdialog — маленькая утилита на основе библиотеки GTK+, предназначенная для разработки GUI для скриптов оболочки. Она может также использоваться со многими другими языками программирования. С помощью нее программист легко может создать GUI не только для любого скрипта или команды UNIX, но для любой интерпретируемой или компилируемой программы, способной создавать дочерние процессы и использовать программные каналы.
Puppy Linux содержал 3 версии Gtkdialog, которые можно было запускать независимо друг от друга (gtkdialog, gtkdialog2, gtkdialog3). От первой из них впоследствие отказались. Описания двух оставшихся не отличаются.
Пример использования:
#! /bin/bash export MAIN_DIALOG=' <vbox> <text> <label>This is a label...</label> </text> <hbox> <button ok></button> <button cancel></button> </hbox> </vbox>' gtkdialog --program MAIN_DIALOG
В этом примере Gtkdialog с опцией --program
, принимающей в качестве параметра описание создаваемого окна, запускает дочерний процесс, а стандартная команда export скрипта BASH записывает описание окна в переменную окружения MAIN_DIALOG и передает ее в создаваемый затем дочерний процесс.
Gtkdialog отправляет значения полей на стандартное устройство вывода, и это позволяет считывать введенные пользователем данные.
#! /bin/bash export DIALOG=' <vbox> <entry> <variable>ENTRY</variable> </entry> <hbox> <button ok></button> <button cancel></button> </hbox> </vbox>' I=$IFS; IFS="" for STATEMENTS in $(gtkdialog --program DIALOG); do eval $STATEMENTS done IFS=$I if [ "$EXIT" = "OK" ]; then echo "You entered: $ENTRY." else echo "You pressed the Cancel button." fi
Здесь стандартной командой for пробегаем по списку, созданному командой gtkdialog. Изменение разделителя полей (IFS) необходимо для сохранения пробелов во введенных пользователем данных.
С помощью Gtkdialog можно создавать «самоисполняющиеся» программы вида
#! /usr/local/bin/gtkdialog -f <vbox> <checkbox> <label>This is a checkbox</label> <variable>CHECK1</variable> </checkbox> <checkbox> <label>Another one</label> <variable>CHECK2</variable> </checkbox> <button> <label>OK</label> </button> </vbox>
При этом введенные данные можно считать из стандартного вывода оболочки.
Описываются для Gtkdialog простым XML-образным языком. Сами интерфейсные элементы — суть простые GUI элементы, такие как кнопки, поля ввода, списки и т.д. Они имеют атрибуты, состояния и действия (*note Actions). Группируются с помощью контейнеров (*note Containers), горизонтальных и вертикальных коробок или фрэймов. Каждый интерфейсный элемент должен быть помещен в один из контейнеров, ни один элемент не должен оставаться сам по себе, т.к. это опасно.
Интерфейсный элемент статичного текста. Создается тэгами <text></text>
. Текст может задаваться строкой <label>СТРОКА</label>
или из файла (<input file>ИМЯ ФАЙЛА</input>
).
Определяется тэгами <button></button>
. Надпись на ней определяется директивой <label>СТРОКА</label>
. По умолчанию будет надпись «OK». Чтобы на кнопке отображалась пиктограмма, можно использовать <input file>ИМЯ ФАЙЛА</input>
. Gtkdialog найдет файл с помощью утилиты locate, если это будет необходимым. Кнопки могут содержать надписи и пиктограммы одновременно. Вот пример:
<button> <input file>/usr/share/GUIcompletion/button_save.xpm</input> <label>Метка</label> </button>
Действие, выполняющееся при нажатии на кнопку, определяется директивой <action>КОМАНДА</action>
. Если действие не задано явно, при нажатии кнопки программа завершается. Это действие по умолчанию. Для кнопки можно определять несколько действий. Последовательные директивы <action>КОМАНДА</action>
будут исполняться одна за другой в той последовательности, как написаны.
Начальную видимость кнопки можно определить с помощью директивы <visible>ВИДИМОСТЬ</visible>
. ВИДИМОСТЬ может принимать значения 'enabled' или 'disabled'. Отключенная кнопка затенена и не может быть активирована пользователем.
Gtkdialog поддерживает несколько стандартных (предопределенных) кнопок для упрощения программирования диалоговых окон:
<button ok></button> <button cancel></button> <button help></button> <button yes></button> <button no></button>
Весь текст и пиктограммы на них уже заданы, ничего дополнительно определять не требуется.
Интерфейный элемент ввода данных — простое поле ввода, используемое для получения строки, набранной пользователем. Директива <default>СТРОКА</default> определяет начальное содержимое элемента.
<visible>ВИДИМОСТЬ</visible> определяет «видимость» элемента ('enabled', 'disabled' или 'password'). «Невидимое» (значение 'disabled') поле ввода — такое, которое видно, но его невозможно изменить. (В Borland Delphi под Windows аналогичное состояние элемента соответствует выключенному свойству Enabled, тогда как свойство Visible при отключении делает элемент совершенно невидимым.) Значение 'password' делает поле редактируемым, но не читаемым. Такие поля используются для ввода паролей.
Директива <action>КОМАНДА</action> определяет действие, происходящее в случае изменения содержимого поля ввода.
Элемент, содержащий метку (текст) и флажок, отмечающий состояние элемента (вкл./выкл.). Создается тэгами <checkbox></checkbox>. Метка определяется текстом между тэгами <label></label>. Она обязательно должна быть. Начальное состояние кнопки-флажка определяется директивой <default>СОСТОЯНИЕ</default>. СОСТОЯНИЕ принимает значение 'yes' или 'no'. Как и для предыдущих элементов, возможность изменения состояния флажка определяется директивой <visible>ВИДИМОСТЬ</visible>. Директива <action>КОМАНДА</action> описывает действие, совершаемое при изменении состояния кнопки-флажка. Действие, как и у кнопки, может быть не единственным. При этом действия для кнопки-флажка могут описываться с использованием условного оператора 'if true' или 'if false'.
Пример:
<checkbox> <label>Это кнопка-флажок...</label> <variable>CHECKBOX</variable> <action>echo Кнопка-флажок сейчас $CHECKBOX.</action> <action>if true enable:ENTRY</action> <action>if false disable:ENTRY</action> </checkbox>
Директива <variable>CHECKBOX</variable> здесь возвращает значение флажка в переменную окружения.
Определяется тэгами <pixmap></pixmap>. Сама пиктограмма загружается из файла директивой <input file>ИМЯ ФАЙЛА</input>. Эта единственная директива обязательна. Если файл не читается, Gtkdialog отыщет другой файл с таким же именем при помощи утилиты locate.
Полоса меню (например, главное меню программы) определяется парой тэгов <menubar></menubar>. Внутри определяются меню при помощи пар тэгов <menu></menu>, и уже внутри этих меню — элементы меню (должен быть хотя бы один в каждом) при помощи тэгов <menuitem></menuitem>.
Пример: простейшая полоса меню.
<menubar> <menu> <menuitem> <label>Открыть...</label> </menuitem> <menuitem> <label>Сохранить...</label> </menuitem> <menuitem> <label>Выход</label> <action>EXIT="quit"</action> </menuitem> <label>Файл</label> </menu> </menubar>
Строится при помощи конструкции
<vbox> <tree> <label>ЗАГОЛОВОК</label> <item>ЭЛЕМЕНТ</item> . . . </tree> КНОПКИ... </vbox>
Реализация конструкции «дерево» не завершена.
Если действие интерфейсного элемента задается просто директивой <action>КОМАНДА</action>, то Gtkdialog исполнит ее в подоболочке. Это значит, что Gtkdialog запускает /bin/sh
для обработки операции. Вот как подоболочечная операция работает:
Команда «Exit:ЗНАЧЕНИЕ» завершает Gtkdialog немедленно, а ЗНАЧЕНИЕ отправляется на стандартное устройство вывода в качестве значения переменной EXIT.
Дополнительные примеры по применению gtkdialog2 и gtkdialog3 можно найти в «/usr/share/doc/gtkdialog/examples/».
Скачать программу можно с ftp://linux.pte.hu/pub/gtkdialog/
Установить можно стандартным способом при помощи команд ./configure, make, make install.
Автор — Laszlo Pere
Распространяется на условиях GNU General Public License.