Solución:
Lo descubrí probando todas las cosas por mí mismo. Aunque no pude encontrar ningún tema al respecto, dejaré la solución aquí. Puede que esta no sea la única o la mejor solución, pero funciona para mis propósitos (dentro de los límites de getch) y es mejor que nada.
Nota: adecuado keyDown()
que reconocería todas las teclas y las pulsaciones de teclas reales, todavía se valora.
Solución: utilizando ord()
-función para encender primero el getch()
en un número entero (supongo que son códigos de clave virtuales, pero no muy seguros) funciona bien, y luego comparar el resultado con el número real que representa la clave deseada. Además, si lo necesitara, podría agregar un extra chr()
alrededor del número devuelto para convertirlo en un carácter. Sin embargo, estoy usando principalmente la flecha hacia abajo, esc, etc., por lo que convertirlos en un personaje sería estúpido. Aquí está el código final:
from msvcrt import getch
while True:
key = ord(getch())
if key == 27: #ESC
break
elif key == 13: #Enter
select()
elif key == 224: #Special keys (arrows, f keys, ins, del, etc.)
key = ord(getch())
if key == 80: #Down arrow
moveDown()
elif key == 72: #Up arrow
moveUp()
Además, si alguien más lo necesita, puede encontrar fácilmente los códigos de tecla de Google, o usando Python y simplemente presionando la tecla:
from msvcrt import getch
while True:
print(ord(getch()))
Consulte los documentos getch de MSDN. Específicamente:
Las funciones _getch y_getwch leen un solo carácter de la consola sin hacer eco del carácter. Ninguna de estas funciones se puede utilizar para leer CTRL + C. Al leer una tecla de función o una tecla de flecha, cada función debe llamarse dos veces; la primera llamada devuelve 0 o 0xE0, y la segunda llamada devuelve el código de tecla real.
La función de Python devuelve un carácter. puedes usar ord()
para obtener un valor entero que puede probar, por ejemplo keycode = ord(msvcrt.getch())
.
Entonces, si lee un 0x00 o 0xE0, léalo por segunda vez para obtener el código de una flecha o una tecla de función. A partir de la experimentación, 0x00 precede a F1-F10 (0x3B-0x44) y 0xE0 precede a las teclas de flecha e Ins / Del / Home / End / PageUp / PageDown.
Realmente no quería publicar esto como comentario porque tendría que comentar todas las respuestas y la pregunta original.
Todas las respuestas parecen depender de MSVCRT Microsoft Visual C Runtime. Si desea evitar esa dependencia:
En caso de que desee soporte multiplataforma, utilice la biblioteca aquí:
https://pypi.org/project/getkey/#files
https://github.com/kcsaff/getkey
Puede permitir una solución más elegante.
Ejemplo de código:
from getkey import getkey, keys
key = getkey()
if key == keys.UP:
... # Handle the UP key
elif key == keys.DOWN:
... # Handle the DOWN key
elif key == 'a':
... # Handle the `a` key
elif key == 'Y':
... # Handle `shift-y`
else:
# Handle other text characters
buffer += key
print(buffer)