python - guia - ¿Cómo hago un menú que no requiera que el usuario presione[enter] para hacer una selección?
qgis español (4)
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.
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 entrada) requieren que el usuario presione Enter después de hacer 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...
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.
En Linux:
- establecer el modo raw
- seleccionar y leer la pulsación de tecla
- restablecer 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"
En Windows:
import msvcrt
answer=msvcrt.getch()