2010-08-19 20 views
14

Estoy usando raw_input en Python para interactuar con el usuario en shell.raw_input en python sin presionar enter

c = raw_input('Press s or n to continue:') 
if c.upper() == 'S': 
    print 'YES' 

Funciona según lo previsto, pero el usuario tiene que presionar Enter en el shell después de presionar 's'. ¿Hay alguna forma de lograr lo que necesito de una entrada de usuario sin tener que presionar Enter en el intérprete de comandos? Estoy usando máquinas * nixes.

+0

[http://stackoverflow.com/questions/292095/polling-the-keyboard-in-python](http://stackoverflow .com/questions/292095/polling-the-keyboard-in-python) –

+0

Consulte esta página. Utiliza el módulo ttyl y solo tiene dos líneas. simplemente omita el comando ord(): http://stackoverflow.com/questions/575650/how-to-obtain-the-keycodes-in-python – incognick

Respuesta

11

En Windows, es necesario el módulo msvcrt, en concreto, parece por la forma en que usted describe su problema, la función msvcrt.getch:

Leer pulsar una tecla y volver al caracteres resultante. Nada se repite a la consola. Esta llamada bloqueará si no hay una tecla presionada disponible actualmente , pero no esperará que se presione Enter .

(etc - vea los documentos que acabo de señalar). Para Unix, ver p. this recipe para una manera simple de construir una función similar getch (vea también varias alternativas & c en el hilo de comentarios de esa receta).

+0

Funciona según lo previsto, y tener una solución multiplataforma es excelente. ¡Gracias por responder! –

+0

@Somebody, de nada! –

+0

Vaya a https://pypi.python.org/pypi/readchar directamente, parece hacer la mayor parte de esto, aunque no puedo leer correctamente las teclas de flecha en OSX. – boxed

8

Python no proporciona una solución multiplataforma de fábrica.
Si está en Windows podría intentar msvcrt con:

import msvcrt 
print 'Press s or n to continue:\n' 
input_char = msvcrt.getch() 
if input_char.upper() == 'S': 
    print 'YES' 
+0

Me he encontrado con este módulo, pero necesito que funcione en * nixes. ¡Gracias de cualquier manera! –

3

En lugar del módulo msvcrt también se podría utilizar WConio:

>>> import WConio 
>>> ans = WConio.getkey() 
>>> ans 
'y' 
1

En una nota lateral, msvcrt.kbhit() devuelve una valor booleano que determina si actualmente se está presionando alguna tecla en el teclado.

Así que si estás haciendo un juego o algo y quieres que las pulsaciones de teclas hagan cosas pero no detengas el juego por completo, puedes usar kbhit() dentro de una declaración if para asegurarte de que la clave solo se recupera si el usuario quiere hacer algo

Un ejemplo en Python 3:

# this would be in some kind of check_input function 
if msvcrt.kbhit(): 
    key = msvcrt.getch().decode("utf-8").lower() # getch() returns bytes data that we need to decode in order to read properly. i also forced lowercase which is optional but recommended 
    if key == "w": # here 'w' is used as an example 
     # do stuff 
    elif key == "a": 
     # do other stuff 
    elif key == "j": 
     # you get the point 
1

Para obtener un solo carácter, he utilizado getch, pero yo no sé si funciona en Windows.

2

maldiciones pueden hacer eso también:

import curses, time 

#-------------------------------------- 
def input_char(message): 
    try: 
     win = curses.initscr() 
     win.addstr(0, 0, message) 
     while True: 
      ch = win.getch() 
      if ch in range(32, 127): break 
      time.sleep(0.05) 
    except: raise 
    finally: 
     curses.endwin() 
    return chr(ch) 
#-------------------------------------- 
c = input_char('Press s or n to continue:') 
if c.upper() == 'S': 
    print 'YES' 
Cuestiones relacionadas