Quiero que mi script espere hasta que el usuario presione cualquier tecla.Cómo hago para que python espere una tecla presionada
¿Cómo puedo hacer eso?
Quiero que mi script espere hasta que el usuario presione cualquier tecla.Cómo hago para que python espere una tecla presionada
¿Cómo puedo hacer eso?
En Python 3, no existe raw_input()
. Por lo tanto, sólo tiene que utilizar:
input("Press Enter to continue...")
Esto sólo espera a que el usuario pulse entrar, sin embargo, por lo que es posible que desee utilizar msvcrt ((Windows/DOS) El módulo msvcrt le da acceso a una serie de funciones en Microsoft Visual C/C++ Runtime Library (MSVCRT)):
import msvcrt as m
def wait():
m.getch()
Esto debería esperar a que se presione una tecla.
Una forma de hacer esto en Python 2, es utilizar raw_input()
:
raw_input("Press Enter to continue...")
En python3 es sólo input()
¿Qué pasa cuando puede ser una de una serie de claves? No solo 'enter'? – noio
[Con Python 3+] (http://stackoverflow.com/questions/954834/easy-how-to-use-raw-input-in-3-1), esto ha cambiado a 'entrada()'. – palswim
http://stackoverflow.com/questions/1394956/how-to-do-hit-any-key-in-python –
La pitón manual proporciona lo siguiente:
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", repr(c)
except IOError: pass
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
que puede ser enrollado en su caso de uso.
Es una buena práctica copiar lo que está enlazando para que el conocimiento permanezca, incluso si el enlace muere (¡y lo hacen!). – Richard
¿Cómo puedo hacer que esto funcione en Python 3.x? En 3.x, después de cambiar la declaración de impresión para que sea compatible, esto simplemente se repite infinitamente y no espera la entrada. Sin embargo, funciona muy bien en Python 2. – cat
El enlace se ha actualizado para redirigir a una página diferente. El nuevo enlace es [aquí.] (Https://docs.python.org/2/faq/library.html # how-do-i-get-a-single-keypress-at-a-time) – Matthias
no sé de una manera independiente de la plataforma de hacerlo, pero en Windows, si se utiliza el módulo de msvcrt, puede utilizar su función getch:
import msvcrt
c = msvcrt.getch()
print 'you entered', c
mscvcrt también incluye la no-bloqueo Función kbhit() para ver si se presionó una tecla sin esperar (no estoy seguro de si hay una función de maldición correspondiente). En UNIX, existe el paquete de curses, pero no estoy seguro si puede usarlo sin usarlo para todo el resultado de la pantalla. Este código funciona bajo UNIX:
import curses
stdscr = curses.initscr()
c = stdscr.getch()
print 'you entered', chr(c)
curses.endwin()
Tenga en cuenta que curses.getch() devuelve el ordinal de la tecla pulsada por lo que hacen que tiene la misma salida que tuve que echarlo.
Usar curses es mucho más agradable que los ejemplos algo intrincados descritos en el manual, incluso si implica una gran dependencia. +1 – Damian
En mi cuadro Linux, uso el siguiente código. Esto es similar a la entrada manual mencionada en otra parte, pero ese código gira en un bucle cerrado donde este código no y hay muchos casos de esquina impares que el código no da cuenta de que este 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 the character of the key that was pressed (zero 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
try:
ret = sys.stdin.read(1) # returns a single character
except KeyboardInterrupt:
ret = 0
finally:
# restore old state
termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
return ret
Si desea ver si se pulsa una tecla exacta (como decir 'b') Haga lo siguiente:
while True:
choice = raw_input("> ")
if choice == 'b' :
print "You win"
input("yay")
break
Esto requiere que el usuario escriba 'b' (u otra cosa) luego presione enter, que es bastante diferente de lo que el OP está pidiendo. –
Si estás bien con función de sistema de comandos que puede utilizar lo siguiente:
Linux:
os.system('read -s -n 1 -p "Press any key to continue..."')
print
de Windows:
os.system("pause")
os.system parece invocar siempre sh, que no reconoce las opciones syn de lectura.Sin embargo, el comando de lectura se puede pasar a golpear:
os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")
La documentación de lectura me hace pensar que no se agotará el tiempo de espera a menos que especifique la opción -t. –
Simplemente usando
input("Press Enter to continue...")
provocará una SyntaxError: EOF espera mientras se analizaba.
simple uso del arreglo:
try:
input("Press enter to continue")
except SyntaxError:
pass
No use 'input' en python 2 - la función correcta es' raw_input'. En python 2, 'input' es equivalente a' eval (raw_input()) '. – Blorgbeard
Esto ignora todas las teclas que el usuario presiona, hasta que presionen enter, que es bastante diferente de lo que el OP está pidiendo. –
Además, si iba a usar 'entrada', capturar un SyntaxError no es apropiado. Independientemente de los tipos de usuario que se evalúen, si, por ejemplo, escriben "1/0", se genera un ZeroDivisionError en lugar de un SyntaxError, y su programa se cerrará. –
o que podría hacer
print("This is a good joke")
print("what happened when the chicken crossed the road")
gap = input("")
if gap == (""):
print("")
else:
print("")
print("it died")
Esto ignora todas las teclas que el usuario presiona hasta que presionen enter, que es bastante diferente de lo que el OP está pidiendo. –
Me hizo reír pero no ayudó a nadie. –
Plataforma Cruz, Python 2/3 código:
# import sys, os
def wait_key():
''' Wait for a key press on the console and return it. '''
result = None
if os.name == 'nt':
import msvcrt
result = msvcrt.getch()
else:
import termios
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)
try:
result = sys.stdin.read(1)
except IOError:
pass
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
return result
Quité el FCTL/no -bloqueando cosas porque estaba dando IOError
sy yo no lo hice lo necesito Estoy usando este código específicamente porque quiero que bloquee. ;)
Soy nuevo en python y ya estaba pensando que soy demasiado estúpido para reproducir las sugerencias más simples hechas aquí. Resulta que hay una trampa que uno debería saber:
Cuando se ejecuta un script de python desde IDLE, algunos comandos de IO parecen comportarse completamente diferente (ya que en realidad no hay ventana de terminal).
Por ejemplo. msvcrt.getch no bloquea y siempre devuelve $ ff. Esto ya se informó hace mucho tiempo (consulte, por ejemplo, https://bugs.python.org/issue9290), y está marcado como arreglado; de alguna manera, el problema parece persistir en las versiones actuales de python/IDLE.
Por lo tanto, si alguno de los códigos publicados anteriormente no funciona para usted, intente ejecutar el script manualmente, y NO desde el IDLE.
Recibo este error cuando trato de hacer esto en Python 2.7: "SyntaxError: inesperado EOF al analizar " –
@richard muchas personas usan Windows, por lo que +1. – Solarsaturn9
@ Solarsaturn9 y un número cada vez mayor no lo hace. Por lo tanto, esta respuesta no funcionó para mí, y muchos otros que vienen aquí. –