PHPНебольшая программа на PHP-GTK


PHP-GTK — это привязка инструментария для создания графического интерфейса GTK+ к языку программирования PHP. Я про неё уже писал на OpenLife. Очень многие скептически относятся к этой библиотеке, даже не столько к ней самой, сколько к использованию PHP на десктопе. Но, так или иначе, библиотека существует и, более того, развивается, о чём говорит недавняя новость на официальном сайте. Поэтому предлагаю более детально познакомиться с PHP-GTK и написать небольшую программу.
Программа создаёт окно и отображает в нём текстовый виджет, содержащий целое число (по умолчанию — 0), кнопку «Увеличить», при нажатии на которую число будет увеличено на один, и кнопку «Сбросить», сбрасывающее значение текстового виджета на ноль.


Создание базового окна


Окно создаётся с помощью конструктора класса GtkWindow(). Для определения позиции, занимаемой окном после создания, применяется метод set_position(), set_title() устанавливает заголовок, а set_size_request() — размеры окна (-1 говорит о том, что высота будет подобрана автоматически исходя из размеров содержимого). При закрытии окна издаётся сигнал 'destroy'. В этот момент для корректного завершения работы программы необходимо вызвать Gtk::main_quit(), для этого применяется метод connect_simple().
$window = new GtkWindow();
$window->set_position(Gtk::WIN_POS_CENTER);
$window->set_size_request(160, -1);
$window->set_title('PHP-GTK');
$window->connect_simple('destroy', 'Gtk::main_quit');


Виджеты


Как уже было сказано ранее, в программе используется один текстовый виджет GtkLabel() и две кнопки GtkButton(). Для того, чтобы разместить их в окне необходимо применить специальный вертикальный контейнер GtkVBox(), т.к. GtkWindow() позволяет поместить в себе только один виджет.
$vbox = new GtkVBox();
$label = new GtkLabel('0');
$btn_inc = new GtkButton('Увеличить');
$btn_cancel = new GtkButton('Сбросить');
$vbox->pack_start($label);
$vbox->pack_start($btn_inc);
$vbox->pack_start($btn_cancel);


Взаимодействие с пользователем


При нажатии на кнопки издаётся сигнал 'clicked', «услышав» который вызовем функцию increment() для увеличения числа и cancel() для сброса значения. В методе connect_simple() после названия функции идёт список передаваемых вызываемой функции параметров. В данном случае обеим функциям передаём виджет GtkLabel(). Для того, чтобы получить текст, находящийся в данный момент в GtkLabel() необходимо применить метод get_label(), а для установки нового значения — set_label().
$btn_inc->connect_simple('clicked', 'increment', $label);
$btn_cancel->connect_simple('clicked', 'cancel', $label);
 
function increment($label)
{
    $int = $label->get_text();
    $int++;
    $label->set_text($int);
}
 
function cancel($label)
{
    $label->set_text('0');
}


Теперь остаётся только добавить контейнер в окно и отобразить окно на экране. Полный код программы:
<?php

$window = new GtkWindow();
$window->set_position(Gtk::WIN_POS_CENTER);
$window->set_size_request(160, -1);
$window->set_title('PHP-GTK');
$window->connect_simple('destroy', 'Gtk::main_quit');

$vbox = new GtkVBox();
$label = new GtkLabel('0');
$btn_inc = new GtkButton('Увеличить');
$btn_cancel = new GtkButton('Сбросить');
$vbox->pack_start($label);
$vbox->pack_start($btn_inc);
$vbox->pack_start($btn_cancel);

$btn_inc->connect_simple('clicked', 'increment', $label);
$btn_cancel->connect_simple('clicked', 'cancel', $label);

function increment($label)
{
    $int = $label->get_text();
    $int++;
    $label->set_text($int);
}

function cancel($label)
{
    $label->set_text('0');
}

$window->add($vbox);
$window->show_all();
Gtk::main();

?>
  • +9
  • Shecspi
  • 11 июля 2009, 08:51

Комментарии (6)

Любопытно :) Продолжение будет?
Да, обязательно, как только придумаю, в каком виде подать информацию. Хочется, чтобы она отличалась от той, что находится в моём блоге.
Русскоязычный блог о PHP-GTK 2.
Действительно хорошая инвормация на вашем блоге. Уже в закладках.
отлично, но мне было бы интересней прочитать просто о гтк без привязки к языку
Чистый сишный GTK отличается от PHP-GTK только тем, что в нём нет классов, а значит вместо new GtkWindow будет gtk_window_new(GtkWindowType type), вместо $label->get_text() будет gtk_label_get_text(GtkLabel * label) и т.д…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.