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
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.
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)
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.
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.
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. –
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
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)]
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
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!
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
se dirige con el error de sintaxis con la referencia de Días en la línea 'valueH = (valueD-days) * 365' – jxramos
Eso está resuelto ahora –
- 1. ¿Cronómetro cronómetro .Net y multinúcleo?
- 2. Cronómetro de alto rendimiento frente a Cronómetro
- 3. Cronómetro eficiente
- 4. cronómetro JavaFX
- 5. reprogramar el cronómetro en android
- 6. Creando un cronómetro en Android
- 7. Función de cronómetro en R
- 8. lógica de cronómetro
- 9. Cronómetro de Visual C++
- 10. Android Cronómetro formato
- 11. Cronómetro reiniciable Java
- 12. Reinicio del cronómetro
- 13. Cronómetro para silverlight?
- 14. Android: cronómetro como un cronómetro persistente. Cómo establecer la hora de inicio? ¿Qué es el cronómetro "Base"?
- 15. ¿Está realmente roto el cronómetro?
- 16. Diferencias en ticks transcurridos propiedad del cronómetro
- 17. Cronómetro que cuenta regresivamente en C#
- 18. cronómetro no se detiene en el androide
- 19. Clase de cronómetro para Java
- 20. Java: Cronómetro e hilo crea
- 21. .NET Cronómetro - penalización de rendimiento
- 22. cómo cambiar el formato del cronómetro?
- 23. Mostrar milisegundos con el cronómetro Android
- 24. Patrón de observador para el cronómetro
- 25. Comprobar si el cronómetro está funcionando
- 26. ¿Por qué mi cronómetro deja de funcionar?
- 27. Android - Obtenga tiempo del widget del cronómetro
- 28. ¿Está consciente el cronómetro en espera/dormir/hibernar de .NET?
- 29. ¿Se puede usar Cronómetro en el código de producción?
- 30. Cronómetro de Java que actualiza la GUI cada segundo?
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