在 Python 中检测到 NUMLOCK / CAPSLOCK / SCRLOCK keypress/keyup

Detecting a NUMLOCK / CAPSLOCK / SCRLOCK keypress/keyup in Python

在我正在开发的游戏中,我想检测 NUMLOCK keypress(或 keyup),就像在按下时注册一个 "callback" 函数。

我不要求在给定时刻读取它的 状态 I can do that already,我也不想改变它的值。这是关于在按键发生时意识到按键,所以我不必每隔十分之一秒左右轮询一次它的状态。

游戏使用 curses,当前使用格挡 getch()。 Curses 没有检测到 NUMLOCK 按键,我从没想过它会检测到(led 相关键盘没有 "produce" 任何键),我想知道是否有比用非阻塞 getch() 替换主 curses 循环并调用 keyboard_leds() 函数来读取当前状态。

例如:我可以在初始化 curses 后启动一个新线程,将其 stdscr 屏幕作为参数传递,并且该线程将为该事件注册一个回调函数(例如,special_keypress()NUMLOCK 按键。因此,该函数只会在需要时调用 keyboard_leds(),然后更新 stdscr.

我不确定这是否可行,而且我知道我可能不得不深入研究一些与体系结构相关的东西(kernel/X11,等等),所以如果跨-平台解决方案是不可能的,那么我可以使用 Linux-只有一个。

好吧,这就像用蒸汽锤敲碎坚果(特别是如果你正在创建一个 CLI rogue-like 游戏),但 Pyglet 在 OS X 中至少获得了 NUMLOCK 按键。我不能'虽然它无法与 CAPSLOCKSCROLLLOCK 一起使用,但我的系统热键几乎以各种可能的方式被覆盖,所以它可能只是我。

您可以尝试测试它是否更适合您,然后看看 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()