Обнаружение нажатия / нажатия клавиш 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()
Другие вопросы по тегам