¿Cómo creo un menú que no requiere que el usuario presione [enter] para realizar una selección?

StackOverflow https://stackoverflow.com/questions/1829

  •  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...
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top