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

时间:2015-02-04 14:55:35

标签: python keyboard curses num-lock

在我正在开发的游戏中,我想要检测NUMLOCK 按键 (或 keyup ),例如注册被按下时的“回调”功能。

我不是要求在特定时刻阅读其I can do that already,我也不想改变它的价值。它是关于在发生时知道按键所以我不必每隔十分之一左右轮询它的状态。

游戏使用curses,目前阻止getch()。 Curses没有检测到NUMLOCK按键,我从没想过它(与led相关的键盘没有“产生”任何键),我想知道是否有任何方法可以做到这一点比更换main curses循环使用非阻塞getch()并调用keyboard_leds()函数来读取当前状态。

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

我不确定这是否可行,而且我知道我可能不得不接受一些与架构相关的东西(kernel / X11等),所以如果不是跨平台的解决方案可能,那么我只使用Linux版本。

1 个答案:

答案 0 :(得分:2)

好吧,它就像使用蒸汽锤来破解坚果(特别是如果你正在创建一个类似CLI的流氓游戏),但是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()