3

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

我不是要求在给定时刻读取它的状态,我已经可以这样做,我也没有兴趣改变它的值。这是关于在发生按键时意识到按键,所以我不必每十分之一秒左右轮询它的状态。

游戏使用curses的,目前是一个拦截getch()。诅咒没有检测到NUMLOCK按键,我从没想过它会(与 LED 相关的键盘不会“产生”任何键),我想知道是否有任何方法比用 a 替换主 curses 循环更好非阻塞getch()并调用keyboard_leds()函数来读取当前状态。

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

我不确定这是否可能,而且我知道我可能不得不深入到一些依赖于架构的东西(内核/X11 等),所以如果跨平台解决方案是不可能的,那么我对仅 Linux 的设备很好。

4

1 回答 1

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()
于 2015-02-04T15:35:33.050 回答