在 Python 中查找箭头键的值:为什么它们是三元组?

2023-11-24

我正在尝试查找本地系统分配给箭头键的值,特别是在 Python 中。我正在使用以下脚本来执行此操作:

import sys,tty,termios
class _Getch:       
    def __call__(self):
            fd = sys.stdin.fileno()
            old_settings = termios.tcgetattr(fd)
            try:
                tty.setraw(sys.stdin.fileno())
                ch = sys.stdin.read(1)
            finally:
                termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
            return ch

def get():
    inkey = _Getch()
    while(1):
            k=inkey()
            if k!='':break
    print 'you pressed', ord(k)

def main():
    for i in range(0,25):
        get()

if __name__=='__main__':
    main()

然后我运行脚本,然后按“上下左右”键,这给了我以下输出:

$ python getchar.py 
you pressed 27
you pressed 91
you pressed 65
you pressed 27
you pressed 91
you pressed 66
you pressed 27
you pressed 91
you pressed 67
you pressed 27
you pressed 91
you pressed 68

这是异常的,因为它表明箭头键在我的系统上注册为某种形式的三元组 (27-91-6x),因为每次按箭头键都会占用 get() 的三个实例。相比之下,按 a、b、c 和 CTRL-C 给出:

you pressed 97
you pressed 98
you pressed 99
you pressed 3

谁能向我解释为什么我的箭头键的值似乎存储为三元组?为什么会这样呢?所有平台都一样吗? (我使用的是 Debian Linux。)如果没有,我应该如何存储箭头键的值?

这里的最终目标是我正在尝试编写一个程序,该程序需要正确识别箭头键并根据按下的箭头键执行功能。


我想我明白了。

我从中学到了here每个箭头键都由唯一的 ANSI 转义码表示。然后我了解到 ANSI 转义码因系统和应用程序而异:在我的终端中,点击cat然后按向上箭头给出^[[A,在C中似乎是\033[A等。后半部分,[A,保持不变,但前面的代码Escape可以是十六进制(以 x 开头)、八进制(以 0 开头)或十进制(数字中无前导)。

然后我打开 python 控制台,插入我之前收到的三元组,试图找到它们的字符值。事实证明,chr(27) gave \x1b, chr(91) gave [,并调用chr on 65,66,67,68A,B,C,D分别。然后就很清楚了:\x1b是转义码!

然后我注意到箭头键在 ANSI 中表示为三元组,当然表示为三个字符,因此我需要修改我的代码以便一次读入三个字符。结果如下:

import sys,tty,termios
class _Getch:
    def __call__(self):
            fd = sys.stdin.fileno()
            old_settings = termios.tcgetattr(fd)
            try:
                tty.setraw(sys.stdin.fileno())
                ch = sys.stdin.read(3)
            finally:
                termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
            return ch

def get():
        inkey = _Getch()
        while(1):
                k=inkey()
                if k!='':break
        if k=='\x1b[A':
                print "up"
        elif k=='\x1b[B':
                print "down"
        elif k=='\x1b[C':
                print "right"
        elif k=='\x1b[D':
                print "left"
        else:
                print "not an arrow key!"

def main():
        for i in range(0,20):
                get()

if __name__=='__main__':
        main()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中查找箭头键的值:为什么它们是三元组? 的相关文章

随机推荐