|
|||||||
Теория сигналов и обратных вызовов
Время создания: 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) таким образом:
Где object является экземпляром GtkWidget (любым виджетом), который будет излучать сигнал. Первый параметр name – это строка, содержащая имя сигнала для перехвата. Вторым параметром func является функция, которая должна быть вызвана при получении сигнала. Третьим параметром func_data передаются параметры, которые нужно передать в функцию. Метод возвращает handler_id который может быть использован для отключения или блокировки обработчика. Функция, указанная вторым параметром, называется “Функция обратного вызова” (далее по тексту, возможно, вы встретите английское обозначение “Callback”), и должна быть в следующей форме:
Здесь первым аргументом является указатель на widget который излучает сигнал. Вторым (callback_data) – указатель на данные, полученные последним аргументом к методу connect(), показанному выше. Если функция обратного вызова является методом объекта, тогда она должна быть в общей форме:
где self экземпляр объекта, выполняющего метод. Функция такого вида использована в примере helloworld.py. ЗАМЕЧАНИЕ Форма функций обратного вызова показанная выше применяется в большинстве случаев, но некоторые специальные сигналы генерируют другие параметры вызова Другой вызов использован в примере helloworld.py так:
connect_object() похож на connect() за тем исключением, что функция обратного вызова использует только один аргумент, и метод callback для аргумента:
где object обычно является виджетом. connect_object() позволяет методам виджетов PyGTK получая только один аргумент (self) использовать обработчики сигналов. |
|||||||
|
|||||||
|