2010-05-04 9 views
5

Quiero que alguien escriba palabras en la consola y autocomplete desde una lista cuando presionen la tecla "tab". Sin embargo, raw_input no devolverá una cadena hasta que alguien presione [Enter].Python get raw_input pero decide manualmente cuándo se realiza la cadena

¿Cómo leo caracteres en una variable hasta que el usuario pulse [Enter]?

* Nota: No quiero usar import readline para autocompletar debido a problemas con el sistema operativo.

Respuesta

5

Hay una entrada en la FAQ oficial sobre esta cuestión, para Unix: http://www.python.org/doc/faq/library/#how-do-i-get-a-single-keypress-at-a-time

Editar (copiado del comentario Donal Fellows' a continuación): "El problema es que el terminal está en modo‘cocinado’por defecto (permitiendo la edición de línea simple) y que para obtener las claves a medida que se escriben, debe colocarse en el modo "raw". (¡Gracias!)

+1

Definitivamente la respuesta correcta. Es posible que desee editar en el que el problema es que el terminal está en modo "cocinado" de forma predeterminada (lo que permite la edición de línea simple) y que para obtener las claves a medida que se escriben, debe colocarse en modo "sin procesar". Y que en ese punto, el que pregunta también tiene que preocuparse por escribir mal y otras cosas como las que el sistema operativo usualmente hace por ellos. –

1

En * nix uso select en sys.stdin que esperar a un personaje, a continuación, en .read(). En Windows utilizar msvcrt.kbhit() y msvcrt.getch().

+0

¿Podría explicar esta solución? No lo implementé, ya que no estaba familiarizado con el módulo de selección ...:/ – EOL

+0

@EOL: ¿Qué significa "desconocido"? Tal vez debería (1) escribir un código y luego (2) hacer una pregunta por separado sobre cualquier problema específico que tenga con ese código. –

+0

@ S.Lott: El siguiente código no captura el primer carácter, pero espera hasta que se presione enter: 'import select, sys; char = select.select ([sys.stdin], [], []) [0] [0] .read (1); imprimir "Leer% s"% char'. Tal vez esto se deba al hecho de que no estoy familiarizado con el módulo 'select', y no sé cómo usarlo. :) – EOL

Cuestiones relacionadas