MyTetra Share
Делитесь знаниями!
Теория сигналов и обратных вызовов
Время создания: 04.05.2017 23:23
Раздел: Python - PyGTK - Теория
Запись: xintrea/mytetra_db_mcold/master/base/1493929398iq9mr6noc8/text.html на raw.githubusercontent.com

ЗАМЕЧАНИЕ

В 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) использовать обработчики сигналов.

 
MyTetra Share v.0.59
Яндекс индекс цитирования