8 августа 2009 г.

Редактор интерфейсов Glade

В PHP-GTK имеется возможность вместо ручного описания интерфейса использовать специальный редактор - Glade. Он сохраняет результаты в XML-файл, который впоследствии подключается классом GladeXML (данный модуль не входит в оригинальную поставку PHP-GTK, поэтому его необходимо подключать отдельно. В Unix это делается при компиляции, в Windows библиотеку можно взять из версии extensions-pack). Далее коротко расскажу об основах работы с Glade.

Интерфейс программы разделён на 3 вертикальные части: в левой располагаются все виджеты GTK+, в средней - созданное нами окно, в правой - параметры выбранного виджета. Сначала обращаемся к левой панели и создаём основу нашего интерфейса. Я использовал 4 виджета - окно, вертикальный контейнер, ярлык и кнопку. Они выделены красным цветом на скриншоте:

Далее на правой панели (вкладка "Основные") вносим необходимые изменения. В нашем случае достаточно указать название виджета и метку для него. Указанное название должно быть уникальным, т.к. с его помощью будет осуществляться доступ к виджету из программы.


На вкладке сигналы можно указать обработчик для соответствующих сигналов. Я указал вызов Gtk::main_quit при сигнале 'destroy' для окна.


Теперь перейдём к коду. Для того, чтобы загрузить glade-файл его необходимо передать конструктору класса GladeXML. Метод signal_autoconnect() автоматически привязывает указанные в glade-файле сигналы к соответствующим обработчикам.
$glade = new GladeXML('intarface.glade');
$glade->signal_autoconnect();


Для того, чтобы получить доступ к созданным виджетам следует применять метод get_widget(), ему в качестве параметра передаётся название виджета, указанное в соответствующем пункте в редакторе интерфейса. Далее с ними можно будет работать как с обычными виджетами.
$window = $glade->get_widget('window1');
$label = $glade->get_widget('label1');
$button = $glade->get_widget('button1');


Получившийся у меня glade-файл:

<?xml version="1.0"?>
<glade-interface>
<!-- interface-requires gtk+ 2.16 -->
<!-- interface-naming-policy project-wide -->
<widget class="GtkWindow" id="window1">
<property name="default_width">200</property>
<property name="default_height">100</property>
<signal name="destroy" handler="Gtk::main_quit"/>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442;, Glade!</property>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button1">
<property name="label" translatable="yes">Press</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>



Полный код программы:

<?php
 
$glade = new GladeXML('intarface.glade');
$glade->signal_autoconnect();
 
$window = $glade->get_widget('window1');
$label = $glade->get_widget('label1');
$button = $glade->get_widget('button1');
 
$button->connect_simple('clicked', 'on_printing');
 
$window->show_all();
Gtk::main();
 
function on_printing()
{
echo "Нажата кнопка\r\n";
}
 
?>

6 комментариев:

Unknown комментирует...

Спасибо, очень интересно, слышал про Glade. Очень хотел бы попробовать. Не подскажите где можно найти extensions-pack этот, в котором есть DLL-ка для Windows?

Shecspi комментирует...

На оф.сайте http://gtk.php.net в разделе download. Вот прямая ссылка - http://gtk.php.net/distributions/php-gtk-2.0.1-win32-extensions.zip

Unknown комментирует...

Супер, работает! Спасибо!
Только у меня на старте в консоль выводится маленькое сообщение -unknown property 'orientaion' for class 'GtkVBox'. В режиме без консоли этого не будет видно, но все же. Возможно версия Glade не совпадает с версией GTK в этом плане? И поэтому свойства этого уже нет в GTK. ("уже" - потому что GTK я ставил 2.0.1 - последнюю что есть).

Shecspi комментирует...

Видимо, да. В таком случае, просто удалите строчку с неизвестным свойством из xml-исходника.

Unknown комментирует...

Супер! Я только что попробовал версию Glade 3.4.1 под Windows - всё работает отлично!Качал отсюда http://www.davidtavarez.com/winglade3/ (ссылка внизу).

Конечно, визуальное редактирование не снимает необходимости понимать как это происходит, но, во-первых, позволяет сразу видеть результат, во-вторых всё равно экономит время на прописывание кода, а в третьих - полностью освобождает код от описания элементов интерфейса.

Unknown комментирует...

Кстати, я открыл ваш файл intarface.glade в Glade 3.4.1 и сохранил снова. Порадовало, что после этого ошибка с GtkVBox уже не появилась.