teclas teclado tecla saber que presionada por leer interrupcion flechas esta detectar como python input ascii non-ascii-characters control-characters

teclado - Encontrar los valores de las teclas de flecha en Python: ¿Por qué son triples?



leer flechas en python (2)

Estoy tratando de encontrar los valores que mi sistema local asigna a las teclas de flecha, específicamente en Python. Estoy usando la siguiente secuencia de comandos para hacer esto:

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()

Luego ejecuté el guión y pulsé ARRIBA ABAJO DERECHA A LA IZQUIERDA, lo que me dio esta salida:

$ 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

Esto es anómalo porque sugiere que las teclas de flecha se registran como una forma de triple (27-91-6x) en mi sistema, ya que cada pulsación de una tecla de flecha toma tres instancias de get (). En comparación, presionar a, b, c y CTRL-C da:

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

¿Alguien puede explicarme por qué los valores de mis teclas de flecha parecen almacenarse como triples? ¿Por qué es esto así? ¿Es esto lo mismo en todas las plataformas? (Estoy usando Debian Linux.) De lo contrario, ¿cómo debo guardar los valores de las teclas de flecha?

El objetivo final aquí es que estoy intentando escribir un programa que necesita reconocer correctamente las teclas de flecha y realizar una función dependiendo de qué tecla de flecha se haya pulsado.


Creo que lo descubrí.

Aprendí de here que cada tecla de flecha está representada por un código de escape ANSI único. Luego aprendí que los códigos de escape de ANSI varían según el sistema y la aplicación: en mi terminal, al golpear a cat y presionar la flecha hacia arriba se obtiene ^[[A , en C parece ser /033[A , etc. La última parte, la [A , sigue siendo el mismo, pero el código para el Escape anterior puede estar en hexadecimal (comenzando con una x), octal (comenzando con un 0) o decimal (sin número de referencia en el número).

Luego abrí la consola de Python y conecté los triples que había recibido anteriormente, tratando de encontrar los valores de los caracteres. Resultó que, chr(27) dio /x1b , chr(91) dio [ , y llamando a chr en 65,66,67,68 devolvió A,B,C,D respectivamente. Entonces estaba claro: /x1b era el código de escape!

Luego noté que una tecla de flecha, en ANSI representada como un triple, está representada, por supuesto, como tres caracteres, así que necesitaba modificar mi código para poder leer tres caracteres a la vez. Aquí está el resultado:

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()


Estoy usando Mac y utilicé el siguiente código y funcionó bien: obtuve los valores de mis teclas de flecha como 0,1,2,3 (Arriba, Abajo, Izquierda, Derecha): Siempre es bueno recordar el código 27 para la tecla ESC también. ¡Atentamente!

while True: key = cv2.waitKey(1) & 0xFF # if the ''ESC'' key is pressed, Quit if key == 27: quit() if key == 0: print "up" elif key == 1: print "down" elif key == 2: print "left" elif key == 3: print "right" # 255 is what the console returns when there is no key press... elif key != 255: print(key)