Теория сигналов и обратных вызовов

Замечание

В GTK+ версии 2.0, система сигналов была перемещена в GLib. Мы не хотим углубляться в детали различий между системой сигналов GLib 2.0 и системой сигналов GTK+ 1.2. Эти различия не должны повлиять на работу с PyGTK.

До подробного разбора helloworld.py, мы поговорим о сигналах и обратных вызовах. GTK+ основан на событиях, это означает, что выполнение в gtk.main() временно приостанавливается до тех пор пока не случится событие, и управление будет передано обрабатывающей функции.

Эта передача управления происходит благодаря идее “Сигналов” (заметим, что эти сигналы не такие, как системные сигналы Unix, и неспособны их использовать, хотя терминология полностью идентична). Когда происходит событие, такое как нажатие на кнопку мыши, то соответствующий сигнал будет “излучаться” нажатым виджетом. Таким образом GTK+ выполняет большую часть работы. Есть сигналы наследуемые всеми виджетами, такие как “destroy”, а есть специфичные сигналы, например, “toggled” для переключателя.

Чтобы кнопка выполняла действие, мы должны установить обработчик сигнала для того, чтобы отлавливать нужный нам сигнал и вызывать соответствующую функцию. Это делается использованием метода connect (из класса GObject) таким образом:

  handler_id = object.connect(name, func, func_data)

Где object является экземпляром GtkWidget (любым виджетом), который будет излучать сигнал. Первый параметр name – это строка, содержащая имя сигнала для перехвата. Вторым параметром func является функция, которая должна быть вызвана при получении сигнала. Третьим параметром func_data передаются параметры, которые нужно передать в функцию. Метод возвращает handler_id который может быть использован для отключения или блокировки обработчика.

Функция, указанная вторым параметром, называется “Функция обратного вызова” (далее по тексту, возможно, вы встретите английское обозначение “Callback”), и должна быть в следующей форме:

  def callback_func(widget, callback_data):

Здесь первым аргументом является указатель на widget который излучает сигнал. Вторым (callback_data) – указатель на данные, полученные последним аргументом к методу connect(), показанному выше.

Если функция обратного вызова является методом объекта, тогда она должна быть в общей форме:

  def callback_meth(self, widget, callback_data):

где self экземпляр объекта, выполняющего метод. Функция такого вида использована в примере helloworld.py.

Замечание

Форма функций обратного вызова показанная выше применяется в большинстве случаев, но некоторые специальные сигналы генерируют другие параметры вызова

Другой вызов использован в примере helloworld.py так:

  handler_id = object.connect_object(name, func, slot_object)

connect_object() похож на connect() за тем исключением, что функция обратного вызова использует только один аргумент, и метод callback для аргумента:

  def callback_func(object)
  def callback_meth(self, object)

где object обычно является виджетом. connect_object() позволяет методам виджетов PyGTK получая только один аргумент (self) использовать обработчики сигналов.


Предыдущая страница На уровень выше Следующая страница
Глава 2. Начало работы Оглавление 2.3. События

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>