Главная » Статьи » Учебник: теория

Обработчик событий
События

События (events) происходят когда пользователь нажимает клавишу мыши или клавиатуры, либо методом messenger.send(). Когда событие произошло, "messenger" панды пытается найти и запустить "event handler" — подпрограмму, написанную пользователем для обработки события. Для создания обработчика события вы должны создать класс, наследуемый от DirectObject. Обработчик события должен быть методом вашего класса.

Объявление класса, могущего быть обработчиком событий

Сначала импортируем DirectObject:
from direct.showbase import DirectObject
Теперь можно создавать класс, наследуемый от DirectObject. Это позволит так же наследовать API системы событий.


class myClassName(DirectObject.DirectObject):

Пример ниже демонстрирует создание класса, который сможет слушать события. Функция "accept" извещает панду, что метод printHello обработчик для события mouse1. "Accept" будет более подробно рассмотрен позже.


class Hello(DirectObject.DirectObject):
def __init__(self):
     self.accept('mouse1',self.printHello)
def printHello(self):
     print 'Hello!'
h = Hello()

Функция - обработчик события

Событие сначала запускает механизм, называемый "Messenger." Messenger может принять или игнорировать вызвавшее его событие. Событие может приниматься каждый раз, либо единожды. Если процедура проверки находится в том же классе, где вызывается accept, то она должна идти с префиксом self, если вне класса — обычным способом.


myDirectObject.accept('Event Name',myDirectObjectMethod)
myDirectObject.acceptOnce('Event Name',myDirectObjectMethod)

Можно указать, что определённое или все события должны игнорироваться.


myDirectObject.ignore('Event Name')
myDirectObject.ignoreAll()

В завершение несколько утилитарных функций для отладки. Обычно messegner не выводит сообщений, когда случается событие, однако можно его переключить в избыточный режим, когда будет печататься каждое принятое событие. Вызов метода toggleVerbose ещё раз переключает messegner обратно в дефолтный режим. Clear очищает словарь messegner'а.


messenger.toggleVerbose()
print messenger
messenger.clear()

Посылка программного события

Можно вручную вызвать событие, выполнив скрипт типа:


messenger.send('Event Name')

Опционально может отправляться дополнительный список параметров. Параметры, определённые в методе accept, передаются первыми, затем передаются параметры send. Пример, приведённый ниже печатает "eggs sausage foo bar":


class Test(DirectObject):
def __init__(self):
     self.accept('spam',self.OnSpam,['eggs','sausage'])
def OnSpam(self,a,b,c,d):
     print a,b,c,d
Test()
messenger.send('spam',['foo','bar'])
run()

Замечания по управлению объектами

Когда DirectObject принимает событие, messenger сохраняет ссылку на этот DirectObject. Если объект больше не нужен, то он должен быть правильно освобождён, должен игнорировать все события. Например следующий код не выполняет то, что казалось бы должен:


import direct.directbase.DirectStart
from direct.showbase import DirectObject
from pandac.PandaModules import *

class Test(DirectObject.DirectObject):
def __init__(self):
     self.accept("FireZeMissiles",self._fireMissiles)

def _fireMissiles(self):
     print "Missiles fired! Oh noes!"

foo=Test() # создаём наш тестовый объект

del foo # пытаемся освободить объект

messenger.send("FireZeMissiles") # упс, но событие после этого почему-то происходит...
run()

Для правильного освобождения нужно предусмотреть метод "destroy", который вызывает "ignoreAll" для удаления из системы событий.


import direct.directbase.DirectStart
from direct.showbase import DirectObject
from pandac.PandaModules import *

class Test(DirectObject.DirectObject):
def __init__(self):
     self.accept("FireZeMissiles",self._fireMissiles)

def _fireMissiles(self):
     print "Missiles fired! Oh noes!"

def destroy(self):
     self.ignoreAll()

foo=Test() # создаём наш тестовый объект

foo.destroy() # пытаемся освободить объект
del foo

messenger.send("FireZeMissiles") # Теперь всё как надо
run()

Категория: Учебник: теория | Добавил: ninth (02.02.2009)
Просмотров: 4567 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0