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)