python windows key keydown getch

¿Método de Python para leer keypress?



windows keydown (3)

Soy nuevo en Python, y acabo de crear un juego y un menú en Python. La pregunta es, que el uso de (raw_) input () requiere que presione enter luego de cada pulsación de tecla, me gustaría hacerlo de modo que al presionar la flecha hacia abajo seleccioné instantáneamente el siguiente elemento del menú, o me muevo hacia abajo en el juego. Por el momento, requiere que me guste escribir "abajo" y luego presionar enter. También investigué bastante, pero preferiría no descargar módulos enormes (por ejemplo, pygame) solo para lograr un único método keyDown (). Entonces, ¿hay alguna manera más fácil, que simplemente no pude encontrar?

Editar: acaba de descubrir que msvcrt.getch() haría el truco. No es KeyDown (), pero funciona. Sin embargo, no estoy seguro de cómo usarlo, parece bastante extraño, ¿alguna ayuda aquí? Esto es lo que obtuve en este momento:

from msvcrt import getch while True: key = getch() print(key)

Sin embargo, sigue dándome todos estos bytes sin sentido, por ejemplo, la flecha hacia abajo es esta:

b''/xe0'' b''P''

Y no tengo idea de cómo usarlos, he intentado comparar con chr () e incluso usar ord () pero no puedo hacer ninguna comparación. Lo que estoy tratando de hacer es básicamente esto:

from msvcrt import getch while True: key = getch() if key == escape: break elif key == downarrow: movedown() elif key == ''a'': ...

Y así sucesivamente ... ¿Alguna ayuda?


Consulte los documentos de MSDN getch . Específicamente:

Las funciones _getch y_getwch leen un único carácter de la consola sin hacer eco del carácter. Ninguna de estas funciones se puede usar para leer CTRL + C. Al leer una tecla de función o una tecla de flecha, cada función debe ser llamada dos veces; la primera llamada devuelve 0 o 0xE0, y la segunda llamada devuelve el código de tecla real.

La función Python devuelve un personaje. puede usar ord() para obtener un valor entero que puede probar, por ejemplo, keycode = ord(msvcrt.getch()) .

Entonces, si lee un 0x00 o 0xE0, léelo una segunda vez para obtener el código de tecla de una flecha o 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 y Ins / Supr / Inicio / Fin / RePág / Descendida.


Lo descubrí probando todo el contenido yo solo. No pude encontrar ningún tema al respecto, así que dejaré la solución aquí. Puede que esta no sea la única ni la mejor solución, pero funciona para mis propósitos (dentro de los límites de getch) y es mejor que nada.

Nota: el keyDown() adecuado de keyDown() que reconocería todas las teclas y las pulsaciones de teclas reales, sigue siendo valorado.

Solución: usar la función ord() para convertir primero el getch() en un entero (supongo que son códigos de clave virtuales, pero no demasiado seguros) funciona bien, y luego comparar el resultado con el número real que representa la clave deseada. Además, si lo necesitaba, podría agregar un chr() extra alrededor del número devuelto para que se convierta en un personaje. Sin embargo, estoy usando principalmente 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()))


from msvcrt import getch pos = [0, 0] def fright(): global pos pos[0] += 1 def fleft(): global pos pos[0] -= 1 def fup(): global pos pos[1] += 1 def fdown(): global pos pos[1] -= 1 while True: print''Distance from zero: '', pos key = ord(getch()) if key == 27: #ESC break elif key == 13: #Enter print(''selected'') elif key == 32: #Space print(''jump'') elif key == 224: #Special keys (arrows, f keys, ins, del, etc.) key = ord(getch()) if key == 80: #Down arrow print(''down'') fdown elif key == 72: #Up arrow print(''up'') fup() elif key == 75: #Left arrow print(''left'') fleft() elif key == 77: #Right arrow print(''right'') fright()