2012-08-02 13 views
5

¿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?

+2

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

+1

@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

+0

_Presione cualquier tecla_ no es igual _introducir cualquier cadena_ – moooeeeep

Respuesta

7

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 
+0

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

+0

Tienes razón. Actualizado para comparar el tiempo. –

0

(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

+1

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. –

+0

@BrendenBrown: Wow, no tenía idea. Gracias por la actualización (esto aumenta mi confusión en el desarrollo de Windows ...) – gsk

2

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

+0

Me gusta este, pero tampoco funciona en Windows. – mgilson

+0

También en su caso especial tiene otro inconveniente que es 'raw_input' espera a que ingrese' \ n' al final, porque Python está en modo de buffer de línea por defecto. – Rsh

Cuestiones relacionadas