¿Cómo creo un menú que no requiere que el usuario presione [enter] para realizar una selección?
-
08-06-2019 - |
Pregunta
Tengo un menú en Python.Esa parte fue fácil.Estoy usando raw_input()
para obtener la selección del usuario.
El problema es ese raw_input
(y entrada) requieren que el usuario presione Ingresar después de hacer una selección.¿Hay alguna manera de hacer que el programa actúe inmediatamente después de presionar una 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 como
print menu
while lastKey = "":
lastKey = check_for_recent_keystrokes()
if "1" in lastKey: #do stuff...
Solución
En Windows:
import msvcrt
answer=msvcrt.getch()
Otros consejos
En Linux:
- establecer el modo sin formato
- seleccionar y leer la pulsación de tecla
- restaurar la configuración normal
import sys import select import termios import 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) return answer print """Menu 1) Say Foo 2) Say Bar""" answer=getkey() if "1" in answer: print "foo" elif "2" in answer: print "bar"
Vaya, eso tomó una eternidad.Ok, esto es 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
Falla mucho al usar IDLE, el python... cosa... que viene con python.Pero una vez que lo probé en DOS (es decir, CMD.exe), como un programa real, funcionó bien.
Nadie lo intente en IDLE, a menos que tenga el Administrador de tareas a mano.
Ya he olvidado cómo vivía con menús que no tienen una respuesta súper instantánea.
La razón por la que msvcrt falla en IDLE es porque IDLE no accede a la biblioteca que ejecuta msvcrt.Mientras que cuando ejecuta el programa de forma nativa en cmd.exe, funciona muy bien.Por la misma razón que su programa explota en terminales Mac y Linux.
Pero supongo que si vas a usar esto específicamente para Windows, tendrás más potencia.