web-dev-qa-db-fra.com

Chronomètre En Python

J'essaie de créer un jeu simple dans lequel l'objectif est de collecter autant de blocs que possible en un temps donné, par exemple 10 secondes. Comment puis-je obtenir un chronomètre pour commencer à compter le début du programme et quand il atteint 10 secondes, faire quelque chose (dans ce cas, sortir d'une boucle)?

31
import time

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

Alternativement, si vous avez déjà votre boucle:

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

Cette méthode fonctionne bien avec pygame , puisqu’elle vous oblige à avoir une grande boucle principale.

35
nmichaels

L'utilisation de time.time ()/datetime.datetime.now () sera interrompue si l'heure système est modifiée (l'utilisateur modifie l'heure, elle est corrigée par un service de synchronisation d'horloge tel que NTP ou par le passage de/à l'heure avancée temps!).

time.monotonic () ou time.perf_counter () semble être la bonne façon de faire, mais ils ne sont disponibles qu'à partir de python 3.3. Une autre possibilité consiste à utiliser threading.Timer. Que cela soit ou non plus fiable que time.time () et ses amis dépend de la mise en œuvre interne. Notez également que la création d'un nouveau thread n'est pas totalement gratuite en termes de ressources système. Ce choix peut donc être un mauvais choix dans les cas où de nombreux minuteurs doivent être exécutés en parallèle.

5
poizan42

J'utilise cette fonction dans mes programmes python. L'entrée pour la fonction est à titre d'exemple:
valeur = 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
4
Martijn van Wezel

L'objet threading.Timer ( documentation ) peut compter les dix secondes, puis l'oblige à définir un indicateur Event indiquant que la boucle doit se terminer.

La documentation indique que le minutage n'est peut-être pas exact - vous devez vérifier s'il est suffisamment précis pour votre jeu.

3
Thomas K

Pour une classe d'assistance StopWatch, voici ma solution qui vous donne une précision sur la sortie et un accès à l'heure de début brute:

class StopWatch:
    def __init__(self):
        self.start()
    def start(self):
        self._startTime = time.time()
    def getStartTime(self):
        return self._startTime
    def elapsed(self, prec=3):
        prec = 3 if prec is None or not isinstance(prec, (int, long)) else prec
        diff= time.time() - self._startTime
        return round(diff, prec)
def round(n, p=0):
    m = 10 ** p
    return math.floor(n * m + 0.5) / m
0
Timothy C. Quinn

Dans cet exemple, la boucle est exécutée toutes les secondes pendant dix secondes:

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