ren*_*nat 19 python keyboard-events
我需要在python终端程序中监听某些按键而不暂停执行raw_input.我已经看到人们使用一些窗口特定的方式来听键击,我看到人们使用像tkinter和pygame这样的大模块,我想避免.
是否有一个轻量级模块,这个跨平台(至少ubuntu,Windows,Mac)?或者有没有办法只使用来自tkinter,pygame等的事件系统......?
如果没有,我应该如何解决这个问题呢?我的第一个想法是将stdin重定向到另一个进程并继续检查它是否包含我的一个事件键.
感谢@unutbu花时间标记这个3岁的问题,并成功回答了另一个问题的副本,其答案不适用于这个问题,因为我特别询问了一个非阻塞解决方案.
我不知道任何侦听按键的跨平台轻量级模块.但是这里有一个建议,以防你想要实现一些简单的事情:
在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)
简短回答:没有Keypresses是系统依赖的.它们是中断驱动的.它们是大多数现代操作系统中内置的基本内容之一.他们有不同的理念,在不失去功能的情况下无法以通用方式统一.
你可以试试 termios = unix,posix风格的文件描述符驱动
curses =门户网站终端式处理(这是一种特定的基于控制台的范例,不是通用的)
Python包含可能来自键盘的某些输入类:例如,sys.stdin用于控制台inupt.
但是试图获得通用键盘输入是一个非常普遍的问题,它本身就是平台依赖的.