在Python中检测键盘按键输入

79 投票
12 回答
162022 浏览
提问于 2025-04-11 20:12

我想知道如何在一个控制台的Python应用程序中检测键盘输入。具体来说,我希望在进行很多其他输入输出操作(比如网络连接、串口访问等)的时候,也能做到这一点:

while True:
    # doing amazing pythonic embedded stuff
    # ...

    # periodically do a non-blocking check to see if
    # we are being told to do something else
    x = keyboard.read(1000, timeout = 0)

    if len(x):
        # ok, some key got pressed
        # do something

在Windows上,正确的Python方式是什么?另外,如果能在Linux上也能用就更好了,虽然这不是必须的。

12 个回答

18

这些答案对我来说都不太管用。这个包,pynput,正好满足我的需求。

https://pypi.python.org/pypi/pynput

from pynput.keyboard import Key, Listener

def on_press(key):
    print('{0} pressed'.format(
        key))

def on_release(key):
    print('{0} release'.format(
        key))
    if key == Key.esc:
        # Stop listener
        return False

# Collect events until released
with Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()
23

这是一个使用curses模块的解决方案。它的功能是根据每次按下的键,打印出一个对应的数字值:

import curses

def main(stdscr):
    # do not wait for input when calling getch
    stdscr.nodelay(1)
    while True:
        # get keyboard input, returns -1 if none available
        c = stdscr.getch()
        if c != -1:
            # print numeric value
            stdscr.addstr(str(c) + ' ')
            stdscr.refresh()
            # return curser to start position
            stdscr.move(0, 0)

if __name__ == '__main__':
    curses.wrapper(main)
39

标准的方法是使用 select 模块。

不过,这个方法在Windows系统上不太好用。对于Windows,可以使用 msvcrt 模块来检测键盘输入。

通常,这种操作会用到多个线程——每个被“监控”的设备一个线程,还有一些后台进程可能需要被设备打断。

撰写回答