Entrada de caracteres sin búfer para python en una máquina con Windows

Lo que estoy tratando de hacer

Estoy tratando de diseñar un cronómetro con el tiempo de vuelta. Cuando presiona “L”, se completa una vuelta y cuando se presiona “S”, se completan todas las vueltas y los tiempos se muestran en orden.

Mientras que en C ++ puedo hacer esto con la función _getch () de conio.h y sería bastante fácil. Quiero escribir este progtwig en python, ya que sería mucho más fácil y también resultó difícil manejar el tiempo en C ++.

Todavía escribí un progtwig (que era para la sincronización del cubo) en este enlace: Temporizador de cubo

Problema

No hay ninguna función como _getch (). Y esto es un problema porque al final de una vuelta no puede presionar una tecla y una tecla Intro, ya que sería un proceso lento e irritante para el usuario.

cosas que leo

Leí sobre la biblioteca de curses, pero desgraciadamente no tiene puerto de Windows.

Probé un progtwig que debía funcionar de acuerdo con el sitio web. Esto fue desde el enlace.

Enlace a la receta getch

Pero no funcionó.

Lo que intenté:

  1. msvcrt.getch()

     >>> importar msvcrt
     >>> msvcrt.getch ()
     '\ xff'

Creo que FF es el equivalente hexadecimal de 255.

No entendí por qué esto está sucediendo.

  1. readch() como se sugiere en @martineau

    importar msvcrt

    def readch (echo = True): “Obtén un solo carácter en Windows”. mientras que msvcrt.kbhit (): # borra el búfer del teclado msvcrt.getch () ch = msvcrt.getch () mientras ch está en ‘\ x00 \ xe0’: # flecha o el prefijo de la tecla de función? msvcrt.getch () ch = msvcrt.getch () # la segunda llamada devuelve el código clave real si echo: msvcrt.putch (ch) return ch.decode ()

    a = []

    para i en el rango (10): a.append (readch ())

El error que tengo:

 >>> Traceback (most recent call last): File "C:/Python25/1.py", line 30, in  a.append(readch()) File "C:/Python25/1.py", line 25, in readch return ch.decode() UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128) 

Lo que necesito ayuda con

Una función que funciona como _getch () o algo equivalente que funciona en una máquina con Windows.

Especificaciones de la máquina

Python IDLE 2.5.4 o 2.6 o 2.7

Windows XP SP3

Esto es lo que he usado que parece funcionar en una consola de Windows. Es algo similar a esa receta de ActiveState, excepto que solo funciona en Windows. Se basa en esta documentación de _getwch() para _getwch() .

 #### windows only #### import msvcrt def readch(echo=True): "Get a single character on Windows." while msvcrt.kbhit(): # clear out keyboard buffer msvcrt.getwch() ch = msvcrt.getwch() if ch in u'\x00\xe0': # arrow or function key prefix? ch = msvcrt.getwch() # second call returns the actual key code if echo: msvcrt.putwch(ch) return ch def pause(prompt='Press any key to continue . . .'): if prompt: print prompt, readch(echo=False) 

(Actualizado para manejar Unicode).

Si está preguntando sobre cómo leer la entrada sin entrada, probablemente esté buscando un enlace. Creo que esto requiere una ventana Tkinter.

 lapEnded = bind_all("", endLap) stopRunning = bind_all(" 

Luego, define las funciones endLap y noMoreRunning , que realizan sus funciones. Dependiendo de su versión de Tkinter y / o Python, bind_all puede ser simplemente un bind . Espero que esto responda a su pregunta.