Panda3D имеет встроенную поддержку клавиатуры. Нажатие клавиши генерирует событие (event — подробно о событиях написано в другой главе). Каждая клавиша может посылать события когда будет нажата, отпущена и на протяжении удержания в нажатом состоянии. Объявляются события следующим образом: self.accept( <event name> , <Function> ) self.accept( <event name> , <Function> , <parameters list> ) self.acceptOnce( <event name> , <Function> ) self.acceptOnce( <event name> , <Function> , <parameters list> ) <event name> строковое значение — метка события. <Function> функция питона, которая будет вызвана по событию. <parameters list> список параметров, передаваемых в функцию <Function>. Построение <event name> базируется на следующих правилах: 1. Клавиши с печатаемыми символами имеют имя соответствующее символу. При этом подразумевается, что символ в нижнем регистре и английской раскладке, т.е. модификаторы Shift и Caps Lock не влияют Например: "a", "b", "3", "[", и т.д. Но не "A", "B", "#", "{" 2.Нажатие клавиши генерирует событие соответствующее просто имени клавиши. 3. Для обозначения повторяющихся событий используется имя клавиши + "-repeat" например: "a-repeat", "2-repeat", "[-repeat" 4. Отпускание клавиши соответствует имени + "-up" например: "a-up", "2-up", "[-up" 5. Все события (в т.ч. "-up") могут включать метку времени "time-" + <key name> Пример чтения времени нажатия: class ReadKeys(DirectObject.DirectObject): def __init__(self): self.accept('time-a-repeat', self.printRepeat) def printRepeat(self,a): print "repeat a",a 6. Клавиши, не имеющие печатаемых символов обозначаются следующим образом: "escape", "f"+"1-12" (e.g. "f1","f2",..."f12"), "print_screen" "scroll_lock" "backspace", "insert", "home", "page_up", "num_lock" "tab", "delete", "end", "page_down" "caps_lock", "enter", "arrow_left", "arrow_up", "arrow_down", "arrow_right" "shift", "lshift", "rshift", "control", "alt", "lcontrol", "lalt", "space", "ralt", "rcontrol" Замечание: "print_screen" не доступна в Windows, (и некоторых других ОС) поскольку используется системой. Если вы всё же желаете использовать эту клавишу, то нужно использовать обходные пути. (например, можно использовать "print_screen-up") 7. Некоторые клавиши могут посылать отличающиеся события, например клавиши модификаторов посылают события правой и левой клавиши, но так же посылает нейтральное события. (например, левый shift посылает "lshift" и "shift" событие при нажатии) За исключением "num_lock", "*", и "+" клавиши цифровой клавиатуры дублируют основную. (например, при включенном Num Lock — обе клавиши 1 и на цифровой и на основной клавиатуре посылают событие "1") 8. Клавиши, нажатые в комбинации с модификаторами, обозначаются добавлением этих модификаторов перед символом клавиши с разделением дефисом: "shift-a" "shift-control-alt-a" "shift-alt-a" Составные события не отправляют "time-" . Если необходимо, используйте "time-" с одной из клавиш, входящих в сочетание. Составные события могут отключаться что бы позволить срабатывать регулярным вызовам: base.mouseWatcherNode.setModifierButtons(ModifierButtons()) base.buttonThrowers[0].node().setModifierButtons(ModifierButtons()) Несколько примеров в виде кода: self.accept('k', self.__spam )#вызывает __spam() при нажатии k. self.accept('k-up', self.__spam, [eggs, sausage, bacon,] )#вызывает __spam(eggs,sausage,bacon) self.accept('escape', sys.exit )#выход по esc self.accept('arrow_up', self.spamAndEggs )#вызывает spamAndEggs по нажатию стрелки вверх self.accept('arrow_up-repeat', self.spamAndEggs )#и автоповторяет, если удерживается self.accept('arrow_up-up', self.spamAndEggs )#вызывается, когда стрелка вверх отпускается Замечание — когда окно панды минимизируется, либо теряет фокус по иной причине, для всех клавиш вызывается событие "-up".
|