2011-05-30 17 views
5

Soy un n00b a pitón, y estoy buscando un fragmento de código/muestra, que realiza lo siguiente:Python espera x seg para una clave y continuar la ejecución si no se presiona

  • Mostrar un mensaje como " Presione cualquier tecla para configurar o espere X segundos para continuar "
  • Espere, por ejemplo, 5 segundos y continúe la ejecución, o ingrese una subrutina configure() si se presiona una tecla.

¡Gracias por su ayuda!

Yvan Janssens

Respuesta

16

Si está en Unix/Linux entonces el módulo select le ayudará.

import sys 
from select import select 

print "Press any key to configure or wait 5 seconds..." 
timeout = 5 
rlist, wlist, xlist = select([sys.stdin], [], [], timeout) 

if rlist: 
    print "Config selected..." 
else: 
    print "Timed out..." 

Si estás en Windows, a continuación, busque en el módulo msvcrt. (Nota esto no funciona en modo inactivo, pero lo hará en cmd)

import sys, time, msvcrt 

timeout = 5 
startTime = time.time() 
inp = None 

print "Press any key to configure or wait 5 seconds... " 
while True: 
    if msvcrt.kbhit(): 
     inp = msvcrt.getch() 
     break 
    elif time.time() - startTime > timeout: 
     break 

if inp: 
    print "Config selected..." 
else: 
    print "Timed out..." 

Editar cambió las muestras de código por lo que podría decir si había un tiempo de espera o pulsar una tecla ...

+0

fue de hecho para Linux. ¡Gracias! – friedkiwi

+1

sobre la parte de windows: recomiendo encarecidamente insertar un time.sleep (0.5) al final del while-loop, porque de lo contrario el proceso perderá bastante tiempo de procesador mientras espera ... –

0

Python no tiene ninguna forma estándar de captar esto, solo ingresa el teclado a través de input() y raw_input().

Si realmente quieres esto, puedes usar Tkinter o pygame para capturar las teclas como "eventos". También hay algunas soluciones específicas de plataforma como pyHook. Pero si no es absolutamente vital para su programa, le sugiero que lo haga funcionar de otra manera.

0

Si combina time.sleep, threading.Thread y sys.stdin.read, puede esperar fácilmente una cantidad de tiempo específica para la entrada y luego continuar.

t = threading.Thread(target=sys.stdin.read(1) args=(1,)) 
t.start() 
time.sleep(5) 
t.join() 
Cuestiones relacionadas