¿Cómo puedo hacer un “clic en cualquier tecla” (o tomar una opción del menú) en Python?
¿Hay una forma portátil de hacerlo usando las librerías estándar?
try: # Win32 from msvcrt import getch except ImportError: # UNIX def getch(): import sys, tty, termios fd = sys.stdin.fileno() old = termios.tcgetattr(fd) try: tty.setraw(fd) return sys.stdin.read(1) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old)
try: os.system('pause') #windows, doesn't require enter except whatever_it_is: os.system('read -p "Press any key to continue"') #linux
De los documentos de python :
import termios, fcntl, sys, os fd = sys.stdin.fileno() oldterm = termios.tcgetattr(fd) newattr = termios.tcgetattr(fd) newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO termios.tcsetattr(fd, termios.TCSANOW, newattr) oldflags = fcntl.fcntl(fd, fcntl.F_GETFL) fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK) try: while 1: try: c = sys.stdin.read(1) print "Got character", `c` except IOError: pass finally: termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
Sin embargo, esto solo funciona para las variantes de Unix. No creo que haya una plataforma multiplataforma.
Hace un par de años escribí una pequeña biblioteca para hacer esto de forma multiplataforma (inspirada directamente en la respuesta de John Millikin anterior). Además de getch
, viene con una función de pause
que imprime 'Press any key to continue . . .'
'Press any key to continue . . .'
:
pause()
También puede proporcionar un mensaje personalizado:
pause('Hit any key')
Si el siguiente paso es salir, también viene con una función de conveniencia que llama sys.exit(status)
:
pause_exit(status=0, message='Hit any key')
Instale con pip install py-getch
, o vea esto aquí .
Lo implementé como el siguiente en Windows. getch()
toma un solo carácter
import msvcrt char = 0 print 'Press any key to continue' while not char: char = msvcrt.getch()
en la plataforma Linux, uso os.system
para llamar al os.system
/sbin/getkey
, por ejemplo
continue_ = os.system('/sbin/getkey -m "Please any key within %d seconds to continue..." -c 10') if continue_: ... else: ...
El beneficio es que mostrará una cuenta regresiva de segundos para el usuario, muy interesante 🙂