¿Cómo hago un menú que no requiera que el usuario presione [enter] para hacer una selección?

votos
23

Tengo un menú en Python. Esa parte fue fácil. Estoy usando raw_input()para obtener la selección del usuario.

El problema es que raw_input(y la entrada) requieren que el usuario presione Enterdespués de realizar una selección. ¿Hay alguna manera de hacer que el programa actúe inmediatamente después de una pulsación de tecla? Esto es lo que tengo hasta ahora:

import sys
print Menu
1) Say Foo
2) Say Bar
answer = raw_input(Make a selection> )

if 1 in answer: print foo
elif 2 in answer: print bar

Sería genial tener algo así como

print menu
while lastKey = :
    lastKey = check_for_recent_keystrokes()
if 1 in lastKey: #do stuff...
Publicado el 05/08/2008 a las 03:39
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
9

En Windows:

import msvcrt
answer=msvcrt.getch()
Respondida el 05/08/2008 a las 04:11
fuente por usuario

votos
9

En Linux:

  • establecer el modo raw
  • seleccionar y leer la pulsación de tecla
  • restablecer la configuración normal
import sys
importar seleccionar
termios de importación
importar tty

def getkey ():
    old_settings = termios.tcgetattr (sys.stdin)
    tty.setraw (sys.stdin.fileno ())
    select.select ([sys.stdin], [], [], 0)
    answer = sys.stdin.read (1)
    termios.tcsetattr (sys.stdin, termios.TCSADRAIN, old_settings)
    respuesta de respuesta

imprimir el menú "" "
1) Di Foo
2) Say Bar "" "

respuesta = getkey ()

si "1" en respuesta: imprime "foo"
elif "2" en respuesta: imprimir "bar"

Respondida el 05/08/2008 a las 03:54
fuente por usuario

votos
4

Wow, eso llevó una eternidad. Ok, esto es con lo que terminé

#!C:\python25\python.exe
import msvcrt
print """Menu
1) Say Foo 
2) Say Bar"""
while 1:
    char = msvcrt.getch()
    if char == chr(27): #escape
        break
    if char == "1":
        print "foo"
        break
    if char == "2":
        print "Bar"
        break

No funciona bien con IDLE, el pitón ... cosa ... que viene con python. Pero una vez que lo intenté en DOS (er, CMD.exe), como un programa real, funcionó bien.

Nadie lo prueba en IDLE, a menos que tenga el Administrador de tareas a mano.

Ya he olvidado cómo vivía con menús que no responden súper instantáneamente.

Respondida el 05/08/2008 a las 04:51
fuente por usuario

votos
0

El motivo por el cual msvcrt falla en IDLE es porque IDLE no está accediendo a la biblioteca que ejecuta msvcrt. Mientras que cuando ejecutas el programa de forma nativa en cmd.exe funciona bien. Por la misma razón que su programa explota en los terminales Mac y Linux.

Pero supongo que si vas a usar esto específicamente para Windows, más poder para ti.

Respondida el 05/08/2008 a las 05:28
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more