20 мая 2009 г.

Базовые элементы интерфейса. Часть 2.

Продолжаем знакомства с виджетами PHP-GTK. Сегодня речь пойдёт о радио-кнопках и флажках. Как и в предыдущей статье, вы научитесь создавать эти элементы интерфейса и выполнять определённые действия при их ихменении.


  1. GtkCheckButton(). Данный виджет представляет из себя флажок, справа от которого находится пояснительный текст.

    За установку или снятие флажка отвечает сигнал 'toggled'. Замечю, что установка/снятие флажка происходит при щелчке не только непосредственно по самой кнопке, но и по тексту. Первым параметром этому классу передаётся текстовая строка, а вторым булевый параметр, определяющий обработку комбинации клавиш. По умолчанию он имеет значение TRUE.
    $check->connect('toggled', 'on_check');
     
    function on_check($check)
    {
    echo $check->get_label().' '.$check->get_active()."\n";
    }
    Здесь используется два метода. Первый, как вы знаете, возвращает строку, расположенную справа от флажка. А второй, get_active(), возвращает TRUE в случае, если флажок установлен, иначе FALSE.

  2. GtkRadioButton(). Этот виджет операционная система, как правило, отображает в виде кружка, имеющего в себе ещё один, более маленький, кружок. Он предназначен для выбора одного варианта из нескольких.

    Здесь также смене активной кнопки соответствует сигнал 'toogled'.
    $radio1 = new GtkRadioButton(NULL, 'Радио-кнопка _1', TRUE);
    $radio2 = new GtkRadioButton($radio1, 'Радио-кнопка _2', TRUE);
    $radio3 = new GtkRadioButton($radio1, 'Радио-кнопка _3', TRUE);
    $label = new GtkLabel('Выбрана "'. $radio1->get_label().'"');
    $radio1->connect('toggled', 'on_radio', $label);
    $radio2->connect('toggled', 'on_radio', $label);
    $radio3->connect('toggled', 'on_radio', $label);
     
    function on_radio($radio, $label)
    {
    echo $label->set_text('Выбрана "'.
    $radio->get_label().'"');
    }
    Обратите внимание, на первый параметр, передаваемый классу GtkRadioButton(). Это так называемая "группа". Она предназначена для того, чтобы связать несколько радио-кнопок вместе, т.е. если одна кнопка из группы станет активной, то все остальные станут неактивными. Для первой кнопки группы передаётся NULL, а всем остальным - первая кнопка. Второй параметр - это текстовая строка, третий - комбинации клавиш.
    Я добавил виджет GtkLabel() для того, чтобы показать, как можно "оживить" внешний вид программы. В него записывается название текущей активной кнопки с помощью метода set_text().


Полный код программы:
<?php
 
$window = new GtkWindow();
$window->set_size_request(200, -1);
$window->set_position(Gtk::WIN_POS_CENTER);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
 
$vbox = new GtkVBox();
 
/**
* Флажок.
*/

$check = new GtkCheckButton('_Флажок', TRUE);
$check->connect('toggled', 'on_check');
 
function on_check($check)
{
echo $check->get_label().' '.$check->get_active()."\n";
}
 
$vbox->pack_start(new GtkLabel(), FALSE, FALSE);
$vbox->pack_start($check, FALSE, FALSE);
 
/**
* Радио-кнопки.
*/

$radio1 = new GtkRadioButton(NULL, 'Радио-кнопка _1', TRUE);
$radio2 = new GtkRadioButton($radio1, 'Радио-кнопка _2', TRUE);
$radio3 = new GtkRadioButton($radio1, 'Радио-кнопка _3', TRUE);
$label = new GtkLabel('Выбрана "'.$radio1->get_label().'"');
$radio1->connect('toggled', 'on_radio', $label);
$radio2->connect('toggled', 'on_radio', $label);
$radio3->connect('toggled', 'on_radio', $label);
 
function on_radio($radio, $label)
{
echo $label->set_text('Выбрана "'.$radio->get_label().'"');
}
 
$vbox->pack_start(new GtkLabel(), FALSE, FALSE);
$vbox->pack_start($radio1, FALSE, FALSE);
$vbox->pack_start($radio2, FALSE, FALSE);
$vbox->pack_start($radio3, FALSE, FALSE);
$vbox->pack_start($label, FALSE, FALSE);
$vbox->pack_start(new GtkLabel(), FALSE, FALSE);
 
$window->add($vbox);
$window->show_all();
Gtk::main();
 
?>

2 комментария:

Анонимный комментирует...

За какой надобностью в функции присутствует оператор echo?
function on_radio($radio, $label)
{
echo $label->set_text('Выбрана "'.$radio->get_label().'"');
}

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

Для наглядности (печати в консоль). На сколько я помню, метод set_text возвращает установленную строку, ее мы и печатаем.