¿Cómo espero a que se presione una tecla?
¿Cómo hago para que mi script de Python espere hasta que el usuario presione cualquier tecla?
En Python 3 , use input()
:
input("Press Enter to continue...")
En Python 2 , use raw_input()
:
raw_input("Press Enter to continue...")
Sin embargo, esto solo espera a que el usuario presione Intro.
En Windows/DOS, es posible que desee utilizar msvcrt
. El msvcrt
módulo le brinda acceso a una serie de funciones en la biblioteca de tiempo de ejecución de Microsoft Visual C/C++ (MSVCRT):
import msvcrt as m
def wait():
m.getch()
Esto debería esperar a que se presione una tecla.
Notas:
En Python 3, raw_input()
no existe.
En Python 2, input(prompt)
es equivalente a eval(raw_input(prompt))
.
En Python 3, use input()
:
input("Press Enter to continue...")
En Python 2, use raw_input()
:
raw_input("Press Enter to continue...")
En mi máquina Linux, uso el siguiente código. Esto es similar al código que he visto en otros lugares (en las antiguas preguntas frecuentes de Python, por ejemplo), pero ese código gira en un bucle cerrado donde este código no lo hace y hay muchos casos extraños en los que el código no tiene en cuenta esto. el código lo hace.
def read_single_keypress():
"""Waits for a single keypress on stdin.
This is a silly function to call if you need to do it a lot because it has
to store stdin's current setup, setup stdin for reading single keystrokes
then read the single keystroke then revert stdin back after reading the
keystroke.
Returns a tuple of characters of the key that was pressed - on Linux,
pressing keys like up arrow results in a sequence of characters. Returns
('\x03',) on KeyboardInterrupt which can happen when a signal gets
handled.
"""
import termios, fcntl, sys, os
fd = sys.stdin.fileno()
# save old state
flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
attrs_save = termios.tcgetattr(fd)
# make raw - the way to do this comes from the termios(3) man page.
attrs = list(attrs_save) # copy the stored version to update
# iflag
attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
| termios.ISTRIP | termios.INLCR | termios. IGNCR
| termios.ICRNL | termios.IXON )
# oflag
attrs[1] &= ~termios.OPOST
# cflag
attrs[2] &= ~(termios.CSIZE | termios. PARENB)
attrs[2] |= termios.CS8
# lflag
attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
| termios.ISIG | termios.IEXTEN)
termios.tcsetattr(fd, termios.TCSANOW, attrs)
# turn off non-blocking
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
# read a single keystroke
ret = []
try:
ret.append(sys.stdin.read(1)) # returns a single character
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save | os.O_NONBLOCK)
c = sys.stdin.read(1) # returns a single character
while len(c) > 0:
ret.append(c)
c = sys.stdin.read(1)
except KeyboardInterrupt:
ret.append('\x03')
finally:
# restore old state
termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
return tuple(ret)