versiones guia español actualizar python

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()