带有箭头键的程序中的奇怪故障

时间:2018-07-11 04:57:40

标签: python python-3.x arrow-keys

所以我的程序在这里使用了wasd或用户的箭头键,否则应该给出错误:

import termios
import tty, sys
def getVal():
    old = termios.tcgetattr(sys.stdin)
    tty.setcbreak(sys.stdin.fileno())
    try:
        key = ord(sys.stdin.read(1))
        while key not in [119, 97, 115, 100, 65, 66, 67, 68]:
            print("Please enter w, a, s, or d OR arrow keys only.")
            key = ord(sys.stdin.read(1))

        if key == 119 or key == 65:
            print('up')
        elif key == 97 or key == 68:
            print('left')
        elif key == 115 or key == 66:
            print('down')
        elif key == 100 or key == 67:
            print('right')
    finally:
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old)
while True:
    getVal()

wasd命令可以正常工作,但是当我尝试执行任何箭头键(在本例中为向下键)时,会发生这种情况:

Please enter w, a, s, or d OR arrow keys only.
Please enter w, a, s, or d OR arrow keys only.
down

它给了我2条错误消息和一条故障消息,即使它只应该给出故障消息。为什么会这样?

1 个答案:

答案 0 :(得分:1)

当您按下箭头键(相对于文字键)时,会生成三个值:27(“转义”),91和实际的箭头键(例如68)。如果您读取的第一个值是27,那么您应该读取后两个并且仅解密最后一个。您应该替换此行:

key = ord(sys.stdin.read(1))

具有:

key = ord(sys.stdin.read(1))
if key == 27:
    sys.stdin.read(1) # Skip the next character, must be 91
    key = ord(sys.stdin.read(1))