Detección de una pulsación de tecla NUMLOCK / CAPSLOCK / SCRLOCK en Python

En un juego que estoy desarrollando, quiero detectar una pulsación de NUMLOCK (o keyup ), como registrar una función de “callback” cuando se presiona.

No estoy pidiendo leer su estado en un momento dado, ya puedo hacerlo , ni estoy interesado en cambiar su valor. Se trata de estar al tanto de la pulsación de tecla cuando sucede, por lo que no tengo que sondear su estado cada décima de segundo.

El juego usa curses , y actualmente es un locking getch() . Las maldiciones no detectan NUMLOCK , y nunca esperé que lo hiciera (el teclado relacionado con el led no “produce” ninguna tecla), y me pregunto si hay alguna forma de hacerlo que sea mejor que reemplazar el bucle principal de las cursas con un getch() no bloqueante y llamar a una función keyboard_leds() para leer el estado actual.

Por ejemplo: podría iniciar un nuevo hilo después de inicializar las cursas, pasar su pantalla stdscr como argumento, y ese hilo registraría el registro de una función de callback (por ejemplo, special_keypress() ) para el evento de una NUMLOCK tecla NUMLOCK . Por lo tanto, esa función solo invocaría keyboard_leds() cuando sea necesario, y luego actualizará stdscr .

No estoy seguro de si esto es posible, y estoy consciente de que probablemente tendré que recurrir a algunas cosas que dependen de la architecture (kernel / X11, etc.), por lo que si una solución multiplataforma no es posible, entonces Estoy bien con un solo de Linux.

Bien, es como usar un martillo de vapor para romper las tuercas (especialmente si estás creando un juego tipo CLI), pero Pyglet tiene al menos NUMLOCK pulsadas en OS X. No podría hacerlo funcionar con CAPSLOCK o SCROLLLOCK Sin embargo, pero las teclas de acceso rápido de mi sistema están anuladas en gran medida de todas las formas posibles, por lo que puede ser solo yo.

Puede probar y probar si funciona mejor para usted, y luego ver cómo Pyglet detecta estas claves.

 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()