Python跨平台监听按键?

ren*_*nat 19 python keyboard-events

我需要在python终端程序中监听某些按键而不暂停执行raw_input.我已经看到人们使用一些窗口特定的方式来听键击,我看到人们使用像tkinter和pygame这样的大模块,我想避免.

是否有一个轻量级模块,这个跨平台(至少ubuntu,Windows,Mac)?或者有没有办法只使用来自tkinter,pygame等的事件系统......?

如果没有,我应该如何解决这个问题呢?我的第一个想法是将stdin重定向到另一个进程并继续检查它是否包含我的一个事件键.


编辑

感谢@unutbu花时间标记这个3岁的问题,并成功回答了另一个问题的副本,其答案不适用于这个问题,因为我特别询问了一个非阻塞解决方案.

sco*_*fey 6

我不知道任何侦听按键的跨平台轻量级模块.但是这里有一个建议,以防你想要实现一些简单的事情:

在Python FAQ中一次查看关于获取单个按键的问题.您可以尝试阻止来自sys.stdin和的读取threading.但这可能仅适用于Unix.在Windows上,您可以使用msvcrt.kbhit.

结合Python FAQ和msvcrt模块中的按键配方,生成的kbhit函数将如下所示:

try:
    from msvcrt import kbhit
except ImportError:
    import termios, fcntl, sys, os
    def kbhit():
        fd = sys.stdin.fileno()
        oldterm = termios.tcgetattr(fd)
        newattr = termios.tcgetattr(fd)
        newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
        termios.tcsetattr(fd, termios.TCSANOW, newattr)
        oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
        fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
        try:
            while True:
                try:
                    c = sys.stdin.read(1)
                    return True
                except IOError:
                    return False
        finally:
            termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
            fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
Run Code Online (Sandbox Code Playgroud)

  • -1 这**不**包含与“msvcrt”模块的“kbhit()”函数等效的内容,该函数仅测试是否按下了某个键。这是因为它基于 Python FAQ 中的代码,用于一次按下一个按键。当有可用的字符时,您的改编会执行此操作,然后将读取的字符扔掉,因此它会丢失。 (2认同)

bee*_*onk 6

简短回答:没有Keypresses是系统依赖的.它们是中断驱动的.它们是大多数现代操作系统中内置的基本内容之一.他们有不同的理念,在不失去功能的情况下无法以通用方式统一.

你可以试试 termios = unix,posix风格的文件描述符驱动

curses =门户网站终端式处理(这是一种特定的基于控制台的范例,不是通用的)

Python包含可能来自键盘的某些输入类:例如,sys.stdin用于控制台inupt.

但是试图获得通用键盘输入是一个非常普遍的问题,它本身就是平台依赖的.