GtkDialog2

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></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 для обработки операции. Вот как подоболочечная операция работает:

  1. Сперва Gtkdialog обновляет переменные окружения, хранящие состояние и значение полей. Именно так дочерний процесс узнает о происходящем в вызванном им GUI.
  2. Затем проверяется включаемый в проект файл. Если gtkdialog стартует с опцией »-i ФАЙЛ», программа Gtkdialog запросит подоболочку подключить ФАЙЛ до исполнения команды. Этот странный метод необходим для движимых действиями программ, в которых подоболочка должна загружать оболочечные функции из вызывающего скрипта.
  3. На третьем шаге Gtkdialog запускает команду и ожидает завершения ее выполнения. (Обычно команды могут выполняться в фоновом режиме, путем записи амперсанта в качестве последнего символа, а подоболочка на ждет, пока программа завершится.)

Выход из диалога

Команда «Exit:ЗНАЧЕНИЕ» завершает Gtkdialog немедленно, а ЗНАЧЕНИЕ отправляется на стандартное устройство вывода в качестве значения переменной EXIT.

Управление интерфейсными элементами

  • Closewindow:ИМЯ — Закрывает именованное окно, запущенное командой «Launch:». Сама программа остается активной, если есть еще открытые окна.
  • Launch:ИМЯ — Открывает новое окно, используя переменную среды Widget.
  • Disable:ИМЯ — Выключает данный интерфейсный элемент, если он включен. Выключенные элементы нечувствительны к действиям пользователя.
  • Enable:ИМЯ — Включает данный интерфейсный элемент, если он выключен.
  • Refresh:ИМЯ — Обновляет данный интерфейсный элемент. Если элемент имеет действия, запускаемые при вводе, они выполняются.
  • Save:ИМЯ — Сохраняет введенные в интерфейсный элемент данные в файле, имя которого определяется в аттрибуте <output file>.

Замечание: функция применима только к элементу редактирования, но в данный момент она вообще не работает из-за ошибках в исходном коде Gtkdialog.

  • Fileselect:ВИДЖЕТ
  • Clear:ВИДЖЕТ
  • RemoveSelected:ВИДЖЕТ

Дополнительные примеры по применению gtkdialog2 и gtkdialog3 можно найти в «/usr/share/doc/gtkdialog/examples/».

Скачать программу можно с ftp://linux.pte.hu/pub/gtkdialog/

Установить можно стандартным способом при помощи команд ./configure, make, make install.

Автор — Laszlo Pere
Распространяется на условиях GNU General Public License.

 
programming/gtkdialog2.txt · Последние изменения: 01.03.2016 в 18:18 (внешнее изменение)
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki