2011-05-04 99 views
23

Estoy tratando de crear un juego simple en el que el objetivo es recoger la mayor cantidad de bloques posible en un período de tiempo determinado, por ejemplo 10 segundos. ¿Cómo puedo hacer que un cronómetro comience a marcar al comienzo del programa y cuando llegue a 10 segundos, haga algo (en este caso, salga de un ciclo)?Cronómetro en Python

Respuesta

28
import time 

now = time.time() 
future = now + 10 
while time.time() < future: 
    # do stuff 
    pass 

Alternativamente, si usted ha conseguido ya su bucle:

while True: 
    if time.time() > future: 
     break 
    # do other stuff 

Este método funciona bien con pygame, ya que prácticamente te obliga a tener un gran bucle principal.

+3

En Python 3.3+ 'time.monotonic()' podría ser útil para [evitar algunos problemas de tiempo de programación] (http://stackoverflow.com/a/20529909/4279). – jfs

0

En este ejemplo, el bucle se ejecuta cada segundo durante diez segundos:

import datetime, time 
then = datetime.datetime.now() + datetime.timedelta(seconds=10) 
while then > datetime.datetime.now(): 
    print 'sleeping' 
    time.sleep(1) 
3

El threading.Timer objeto (documentation) pueden contar los diez segundos, a continuación, conseguir que se establece una bandera de suceso que indica que el bucle debe salir .

La documentación indica que el tiempo puede no ser exacto, deberá probar si es lo suficientemente preciso para su juego.

3

El uso de time.time()/datetime.datetime.now() se interrumpirá si se cambia la hora del sistema (el usuario cambia la hora, se corrige con un servicio timesyncing como NTP o cambiando de/a dayligt saving ¡hora!).

time.monotonic() o time.perf_counter() parece ser la forma correcta de hacerlo, sin embargo, solo están disponibles desde python 3.3. Otra posibilidad es usar threading.Timer. Si esto es más confiable que time.time() y sus amigos depende de la implementación interna. También tenga en cuenta que la creación de un nuevo hilo no es completamente gratuita en términos de recursos del sistema, por lo que esta podría ser una mala elección en los casos en que se deben ejecutar muchos temporizadores en paralelo.

+0

El tiempo es ruidoso, por lo que time.time funciona lo suficientemente bien como para que no lo necesite perfecto otherwice, él diría que mi tiempo debe ser ..., .... 1 perfecto o algo más. El tiempo 10 segundos es tiempo. Tiempo suficiente. –

+0

El tiempo estará desactivado en una hora cuando se cambie al horario de verano y se ejecute al revés. ¿Y qué ocurre si se cambia la hora del sistema? ¿Cómo diablos es eso "lo suficientemente preciso"? – poizan42

-1

Como un ejercicio de aprendizaje para mí, he creado una clase para ser capaz de crear varias instancias cronómetro que le puede resultar útil (estoy seguro de que hay mejores versiones más simples/alrededor de los módulos de tiempo o similar)

import time as tm 
class Watch: 
    count = 0 
    description = "Stopwatch class object (default description)" 
    author = "Author not yet set" 
    name = "not defined" 
    instances = [] 
    def __init__(self,name="not defined"): 
     self.name = name 
     self.elapsed = 0. 
     self.mode = 'init' 
     self.starttime = 0. 
     self.created = tm.strftime("%Y-%m-%d %H:%M:%S", tm.gmtime()) 
     Watch.count += 1 

    def __call__(self): 
     if self.mode == 'running': 
      return tm.time() - self.starttime 
     elif self.mode == 'stopped': 
      return self.elapsed 
     else: 
      return 0. 

    def display(self): 
     if self.mode == 'running': 
      self.elapsed = tm.time() - self.starttime 
     elif self.mode == 'init': 
      self.elapsed = 0. 
     elif self.mode == 'stopped': 
      pass 
     else: 
      pass 
     print "Name:  ", self.name 
     print "Address: ", self 
     print "Created: ", self.created 
     print "Start-time: ", self.starttime 
     print "Mode:  ", self.mode 
     print "Elapsed: ", self.elapsed 
     print "Description:", self.description 
     print "Author:  ", self.author 

    def start(self): 
     if self.mode == 'running': 
      self.starttime = tm.time() 
      self.elapsed = tm.time() - self.starttime 
     elif self.mode == 'init': 
      self.starttime = tm.time() 
      self.mode = 'running' 
      self.elapsed = 0. 
     elif self.mode == 'stopped': 
      self.mode = 'running' 
      #self.elapsed = self.elapsed + tm.time() - self.starttime 
      self.starttime = tm.time() - self.elapsed 
     else: 
      pass 
     return 

    def stop(self): 
     if self.mode == 'running': 
      self.mode = 'stopped' 
      self.elapsed = tm.time() - self.starttime 
     elif self.mode == 'init': 
      self.mode = 'stopped' 
      self.elapsed = 0. 
     elif self.mode == 'stopped': 
      pass 
     else: 
      pass 
     return self.elapsed 

    def lap(self): 
     if self.mode == 'running': 
      self.elapsed = tm.time() - self.starttime 
     elif self.mode == 'init': 
      self.elapsed = 0. 
     elif self.mode == 'stopped': 
      pass 
     else: 
      pass 
     return self.elapsed 

    def reset(self): 
     self.starttime=0. 
     self.elapsed=0. 
     self.mode='init' 
     return self.elapsed 

def WatchList(): 
    return [i for i,j in zip(globals().keys(),globals().values()) if '__main__.Watch instance' in str(j)] 
-1

Este es el camino más corto que sé de hacerlo:

def stopWatch(): 
     import time 
     a = 0 
     hours = 0 
     while a < 1: 
      for minutes in range(0, 60): 
       for seconds in range(0, 60): 
        time.sleep(1) 
        print(hours,":", minutes,":", seconds) 
     hours = hours + 1 
-2

nuevo en el mundo pitón!
necesito un cronómetro independiente hora del sistema por lo que se traducía mi vieja clase C++ en Python:

from ctypes.wintypes import DWORD 
import win32api 
import datetime 

class Stopwatch: 

    def __init__(self): 
     self.Restart() 

    def Restart(self): 
     self.__ulStartTicks = DWORD(win32api.GetTickCount()).value 

    def ElapsedMilliSecs(self): 
     return DWORD(DWORD(win32api.GetTickCount()).value-DWORD(self.__ulStartTicks).value).value 

    def ElapsedTime(self): 
     return datetime.timedelta(milliseconds=self.ElapsedMilliSecs()) 

Esto no tiene 49 días atropellados problema debido a las matemáticas DWORD pero AVISO que GetTickCount tiene unos 15 milisegundos granularidad así que no use esta clase si necesita intervalos de tiempo transcurridos de 1-100 milisegundos.

¡Cualquier mejora o comentario es bienvenido!

2

Uso esta función en mis programas de Python. La entrada para la función es como ejemplo:
valor = time.time()

def stopWatch(value): 
    '''From seconds to Days;Hours:Minutes;Seconds''' 

    valueD = (((value/365)/24)/60) 
    Days = int (valueD) 

    valueH = (valueD-Days)*365 
    Hours = int(valueH) 

    valueM = (valueH - Hours)*24 
    Minutes = int(valueM) 

    valueS = (valueM - Minutes)*60 
    Seconds = int(valueS) 


    print Days,";",Hours,":",Minutes,";",Seconds 




start = time.time() # What in other posts is described is 

***your code HERE*** 

end = time.time()   
stopWatch(end-start) #Use then my code 
+1

se dirige con el error de sintaxis con la referencia de Días en la línea 'valueH = (valueD-days) * 365' – jxramos

+0

Eso está resuelto ahora –