¿Cómo puedo esperar a que el usuario presione cualquier tecla durante 20 segundos? Es decir. Muestro el mensaje y cuenta 20 segundos, el código continúa ejecutándose ya sea que pasen 20 segundos O si el usuario presionó alguna tecla. ¿Cómo puedo hacerlo con Python?¿Cómo esperar 20 segundos para que el usuario presione cualquier tecla?
Respuesta
Si estás en Windows:
def wait_for_user(secs):
import msvcrt
import time
start = time.time()
while True:
if msvcrt.kbhit():
msvcrt.getch()
break
if time.time() - start > secs:
break
Es un poco mezquino, pero si alguien golpea a un personaje durante el sueño, estás esperando sin razón. Lo mejor es comparar el tiempo en lugar de dormir. – Logan
Tienes razón. Actualizado para comparar el tiempo. –
(Advertencia: código no probado)
Algo así como:
import sys
import select
rlist, _, _ = select.select([sys.stdin], [], [], timeout=20)
if len(rlist) == 0:
print "user didnt input anything within 20 secs"
else:
print "user input something within 20 secs. Now you just have to read it"
edición véase: http://docs.python.org/library/select.html
No sabía sobre el módulo de selección, eso es bueno saberlo. Acabo de probarlo en Windows, y no funcionó. De los documentos: Nota: Los objetos de archivo en Windows no son aceptables, pero sí los sockets. En Windows, la función subyacente de selección() la proporciona la biblioteca de WinSock y no maneja los descriptores de archivos que no se originan en WinSock. –
@BrendenBrown: Wow, no tenía idea. Gracias por la actualización (esto aumenta mi confusión en el desarrollo de Windows ...) – gsk
Una posible La solución es usar select
para verificar los valores, pero no me gusta, siento que estoy perdiendo el tiempo.
Por otro lado, puede usar la señalización en sistemas Linux para manejar el problema. después de un cierto período de tiempo, se generará una excepción, try
falla y código continúa en except
:
import signal
class AlarmException(Exception):
pass
def alarmHandler(signum, frame):
raise AlarmException
def nonBlockingRawInput(prompt='', timeout=20):
signal.signal(signal.SIGALRM, alarmHandler)
signal.alarm(timeout)
try:
text = raw_input(prompt)
signal.alarm(0)
return text
except AlarmException:
print '\nPrompt timeout. Continuing...'
signal.signal(signal.SIGALRM, signal.SIG_IGN)
return ''
El código ha sido tomada de here
- 1. Cómo esperar a que se presione una tecla en Clojure
- 2. Python, presione cualquier tecla para salir
- 3. Visual Studio 2010 "Presione cualquier tecla para continuar ..." no muestra
- 4. Esperar a Keypress (o) N segundos para caducar
- 5. ¿Cómo compila VS las aplicaciones de la consola para mostrar "Presione cualquier tecla para continuar"?
- 6. C# Hacer que se presione el botón Esperar programa
- 7. Delphi XE necesita 20 segundos para comenzar
- 8. Cómo esperar durante 2 segundos
- 9. ¿Cómo hago un menú que no requiera que el usuario presione [enter] para hacer una selección?
- 10. Presione una tecla con Java
- 11. Cómo capturar la tecla Entrar, presione GtkEntry
- 12. Presione enter o espere 10 segundos para continuar
- 13. hay una forma de utilizar la entrada ("Presione cualquier tecla para continuar") en la versión 2.6
- 14. Android - Obtener la tecla del teclado presione
- 15. Cómo hago para que python espere una tecla presionada
- 16. C# primera vez que uso GetRequestStream() toma 20 segundos
- 17. ¿Cómo suspender el hilo actual durante 20 segundos en java?
- 18. ¿Cómo esperar 5 segundos con jQuery?
- 19. ContinueWhenAll no esperar a que todas las tareas para completar
- 20. Cómo convertir una tecla Intro Pulse en una pestaña Presione la tecla para páginas web
- 21. tecla de función de manejo presione
- 22. Cómo capturar cualquier tecla en X?
- 23. Presione la tecla Escape para llamar al método
- 24. Seleccione el campo NEXT en la tecla Intro Presione
- 25. Suprimir el "presionar cualquier tecla para continuar" en el script por lotes
- 26. CodeMirror tiene contenido pero no se mostrará hasta que presione la tecla
- 27. ¿Cómo hacer para "presionar cualquier tecla" en python?
- 28. ¿Cómo comprobar si la fecha y hora es mayor que 20 segundos
- 29. ¿Cómo esperar asíncronamente x segundos y ejecutar algo entonces?
- 30. ¿Cómo puedo decirle a Perl que ejecute código cada 20 segundos?
Busque sin bloqueo de entrada, a continuación, poner en práctica esa en un ciclo while que comprueba la hora actual en comparación con la hora de inicio. – Lanaru
@Lanaru: ¿por qué un ciclo while? Suena como un mal caso de espera ocupada. Algo como 'select()' con un tiempo de espera podría hacer lo mismo. – gsk
_Presione cualquier tecla_ no es igual _introducir cualquier cadena_ – moooeeeep