(Python)在Windows上检测箭头键

时间:2017-11-18 22:23:18

标签: windows python-3.x

我找到了各种方法来检测任何按键,从诅咒点击到创建一个函数来做到这一点(也就是msvcrt但这有点必须在Linux上工作),但我总是遇到同样的问题:无论哪个箭头键我按下,所有这些函数返回b'\xe0'。我在cmd和powershell中尝试过,结果相同。我正在运行Win7 Pro 64位。

修改:抱歉,我使用了this代码并尝试了msvcrt.getch()click.getchar()

1 个答案:

答案 0 :(得分:1)

我发现箭头键由两个字符代表,所以我修改了this solution,这样如果放入第一个字符,它会读取第二个(和第三个,wtf Linux?)然后将它们转换为与平台无关的字符串。

# Find the right getch() and getKey() implementations
try:
    # POSIX system: Create and return a getch that manipulates the tty
    import termios
    import sys, tty
    def getch():
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(fd)
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
            return ch

    # Read arrow keys correctly
    def getKey():
        firstChar = getch()
        if firstChar == '\x1b':
            return {"[A": "up", "[B": "down", "[C": "right", "[D": "left"}[getch() + getch()]
        else:
            return firstChar

except ImportError:
    # Non-POSIX: Return msvcrt's (Windows') getch
    from msvcrt import getch

    # Read arrow keys correctly
    def getKey():
        firstChar = getch()
        if firstChar == b'\xe0':
            return {"H": "up", "P": "down", "M": "right", "K": "left"}[getch()]
        else:
            return firstChar