Обнаружение нажатия / нажатия клавиш NUMLOCK / CAPSLOCK / SCRLOCK в Python
В игре, которую я разрабатываю, я хочу обнаружить NUMLOCK
нажатие клавиши (или keyup), как регистрация функции "обратного вызова", когда она нажата.
Я не прошу читать его состояние в данный момент, я уже могу это сделать, и я не заинтересован в изменении его значения. Речь идет о том, чтобы знать о нажатии клавиши, когда это происходит, поэтому мне не нужно опрашивать его состояние каждую десятую секунды или около того.
В игре используются curses
и в настоящее время блокировка getch()
, Проклятия не обнаруживает NUMLOCK
нажатия клавиш, и я никогда не ожидал этого (клавиатура, связанная со светодиодами, не "производит" какую-либо клавишу), и мне интересно, есть ли способ сделать это лучше, чем заменить основной цикл curses неблокирующим getch()
и позвонить keyboard_leds()
функция для чтения текущего состояния.
Например: я мог бы начать новый поток после инициализации curses, передав его stdscr
экран в качестве аргумента, и этот поток будет регистрировать зарегистрировать функцию обратного вызова (скажем, special_keypress()
) для события NUMLOCK
нажатие клавиши. Таким образом, эта функция будет вызывать только keyboard_leds()
при необходимости, а затем обновить stdscr
,
Я не уверен, возможно ли это, и я знаю, что мне, вероятно, придется перейти к некоторым зависящим от архитектуры вещам (ядро /X11 и т. Д.), Поэтому, если кросс-платформенное решение невозможно, то Я в порядке с Linux-только один.
1 ответ
ОК, это все равно что использовать паровой молоток, чтобы взломать гайки (особенно если вы создаете игру, похожую на мошенническую CLI), но Pyglet получает как минимум NUMLOCK нажатия клавиш в OS X. Я не мог заставить его работать с CAPSLOCK
или же SCROLLLOCK
хотя, но мои системные горячие клавиши в значительной степени переопределены всеми возможными способами, так что это может быть только я.
Вы можете попробовать и проверить, работает ли он лучше для вас, а затем посмотреть, как Pyglet обнаруживает эти ключи.
import pyglet
from pyglet.window import key
window = pyglet.window.Window()
@window.event
def on_key_press(symbol, modifiers):
if symbol == key.NUMLOCK:
print 'NumLock was pressed, yay!'
elif symbol == key.CAPSLOCK:
print 'CapsLock was pressed, yay!'
elif symbol == key.SCROLLLOCK:
print 'ScrollLock was pressed, yay!'
@window.event
def on_draw():
window.clear()
if __name__ == '__main__':
pyglet.app.run()