Реакция на действия пользователя

Задача
Необходимо производить ответные действия, когда пользователь щелкает по кнопке, выбирает элемент из выпадающего списка или другим образом взаимодействует с GUI-элементами управления.

Решение
Напишите функцию обратного вызова, а затем свяжите ее с сигналом с помощью метода connect():

// создаем окно
$window = &new GtkWindow();
// создаем кнопку с текущим временем в качестве ее метки
$button = &new GtkButton(strftime('%c'));
// установите функцию update_time() в качестве функции
// обратного вызова для сигнала «clicked»
$button->connect('clicked','update_time');
function update_time($b) {
// текст кнопки находится в дочернем элементе кнопки –
// элементе управления метка
$b_label = $b->child;
// set the label text to the current time
$b_label->set_text(strftime('%c'));
}
// добавляем кнопку к окну
$window->add($button);
// показываем окно
$window->show_all();
// необходимо обеспечить корректное завершение программы
function shutdown() { gtk::main_quit(); }
$window->connect('destroy','shutdown');
// запускаем цикл, обрабатывающий сигнал GTK
gtk::main();

Обсуждение
Код в решении показывает окно с кнопкой в нем.


На кнопке находится время, визуализированное с помощью strftime('%c'). Когда по кнопке щелкают, ее метка обновляется и отражает текущее время.

Функция update_time() вызывается всякий раз, когда щелкают по кнопке, поскольку метод $button->connect('clicked','update_time') связывает функцию обратного вызова update_time() с сигналом кнопки clicked. Первый аргумент функции обратного вызова представляет собой элемент управления, сигнал которого запускает вызов функции. В данном случае это означает, что переменная $button передается функции update_time(). Вы говорите функции connect() передать дополнительные параметры функции обратного вызова, передавая их
функции connect() вслед за именем функции обратного вызова. Следующий пример показывает окно с кнопкой и отдельной меткой. Время выводится в метке и обновляется, когда щелкают по кнопке:

// создаем окно
$window = &new GtkWindow();
// создаем контейнер для метки и кнопки
$container = &new GtkVBox();
// создаем метку, показывающую время
$label = &new GtkLabel(strftime('%c'));
// добавляем метку в контейнер
$container->pack_start($label);
// создаем кнопку
$button = &new GtkButton('Update Time');
/* устанавливаем функцию update_time() в качестве функции обратного вызова
для сигнала «clicked» и передаем ей переменную $label */
$button->connect('clicked','update_time',$label);
function update_time($b,$lb) {
$lb->set_text(strftime('%c'));
}
// add the button to the container
$container->pack_start($button);
// добавляем контейнер к окну
$window->add($container);
// показываем окно
$window->show_all();
// необходимо обеспечить корректное завершение программы
function shutdown() { gtk::main_quit(); }
$window->connect('destroy','shutdown');
// запускаем цикл, обрабатывающий сигнал GTK
gtk::main();

Поскольку переменная $label находится в списке аргументов, переданных методу $button->connect(), то она также передается функции update_time().


Вызов функции set_text() для переменной $label обновляет текст, показываемый в метке.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Анализ аргументов программы
Анализ аргументов программы с помощью getopt
Показ в окне графических элементов управления
Показ в окне нескольких графических элементов управления
Показ меню

Вернуться в раздел: PHP / 20. PHP на стороне клиента