在 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 按键。我不能'虽然它无法与 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()
在我正在开发的游戏中,我想检测 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 按键。我不能'虽然它无法与 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()