web-dev-qa-db-fra.com

Afficher un compte à rebours pour la fonction sommeil python

J'utilise time.sleep (10) dans mon programme. Puis-je afficher le compte à rebours dans le shell lorsque j'exécute mon programme?

>>>run_my_program()
tasks done, now sleeping for 10 seconds

et puis je veux qu'il fasse 10,9,8,7 ....

est-ce possible?

16
user1681664

tu pourrais toujours faire

#do some stuff
print 'tasks done, now sleeping for 10 seconds'
for i in xrange(10,0,-1):
    time.sleep(1)
    print i

Cet extrait a la caractéristique légèrement ennuyeuse que chaque numéro soit imprimé sur une nouvelle ligne. Pour éviter cela, vous pouvez

import sys
import time
for i in xrange(10,0,-1):
    sys.stdout.write(str(i)+' ')
    sys.stdout.flush()
    time.sleep(1)
21
aestrivex

Vous pouvez faire une fonction de compte à rebours comme:

import sys
import time

def countdown(t, step=1, msg='sleeping'):  # in seconds
    pad_str = ' ' * len('%d' % step)
    for i in range(t, 0, -step):
        print '%s for the next %d seconds %s\r' % (msg, i, pad_str),
        sys.stdout.flush()
        time.sleep(step)
    print 'Done %s for %d seconds!  %s' % (msg, t, pad_str)

Le retour chariot \r et la virgule , conservera l'impression sur la même ligne (en évitant une ligne pour chaque compte à rebours)

À mesure que le nombre de secondes diminue, pad_str s'assurera que la dernière ligne est remplacée par des espaces au lieu de laisser le ou les derniers caractères derrière pendant que la sortie se raccourcit.

L'impression finale remplace le dernier message d'état par un message terminé et incrémente la ligne de sortie, il y a donc une preuve du retard.

7

C'est le meilleur moyen d'afficher une minuterie dans la console pour Python 3.x:

import time
import sys

for remaining in range(10, 0, -1):
    sys.stdout.write("\r")
    sys.stdout.write("{:2d} seconds remaining.".format(remaining))
    sys.stdout.flush()
    time.sleep(1)

sys.stdout.write("\rComplete!            \n")

Cela écrase la ligne précédente à chaque cycle.

6
Barkles

C'est quelque chose que j'ai appris lors d'une de mes premières python leçons, nous avons joué avec ["/", "-", "|", "\", "|"] mais Le principe est le même:

import time

for i in reversed(range(0, 10)):
    time.sleep(1)
    print "%s\r" %i,
2
Azur

En voici un que j'ai fait:

import time
a = input("How long is the countdown?")
while a != 0:
    print a
    time.sleep(1)
    a = a-1

À la fin, si vous et un autre, vous pouvez mettre une alarme ou autre chose.

1
Silas Poulson

time.sleep() peut revenir plus tôt si le sommeil est interrompu par un signal ou plus tard (dépend de la programmation d'autres processus/threads par OS/l'interpréteur).

Pour améliorer la précision sur plusieurs itérations, pour éviter la dérive pour un grand nombre d'itérations, le compte à rebours peut être verrouillé avec l'horloge:

#!/usr/bin/env python
import sys
import time

for i in reversed(range(1, 1001)):
    time.sleep(1 - time.time() % 1) # sleep until a whole second boundary
    sys.stderr.write('\r%4d' % i)
1
jfs

Bien sûr, il suffit d'écrire une boucle qui imprime 10 moins le compteur d'itérations, puis de la laisser dormir 1 seconde à chaque itération et de l'exécuter pendant 10 itérations. Ou, pour être encore plus flexible:

def printer(v):
    print v
def countdown_timer(duration, step=1, output_function=printer,
                    Prompt='Waiting {duration} seconds.'):
    output_function(Prompt.format(duration=duration))
    for i in xrange(duration/step):
        output_function(duration - step * i)
1
Silas Ray