Замечание
В 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. События |