2008-08-05 12 views
22

Tengo un menú en Python. Esa parte fue fácil. Estoy usando raw_input() para obtener la selección del usuario.¿Cómo hago un menú que no requiera que el usuario presione [enter] para hacer una selección?

El problema es que raw_input (y entrada) requieren que el usuario presione Ingrese despué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 bueno tener algo así como

print menu 
while lastKey = "": 
    lastKey = check_for_recent_keystrokes() 
if "1" in lastKey: #do stuff... 

Respuesta

9

En Windows:

import msvcrt 
answer=msvcrt.getch() 
9

En Linux:

  • establecer el modo en bruto
  • seleccionar y lea la combinación de teclas
  • 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" 

3

Vaya, que tuvo siempre. Ok, esto es lo que he terminado con

#!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 duro usando IDLE, la 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 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 responden súper instantáneamente.

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 va a utilizar esto específicamente para Windows, tendrá más poder.

Cuestiones relacionadas