2013-06-20 38 views
7

Używam time.sleep (10) w moim programie. Czy mogę wyświetlić odliczanie w powłoce po uruchomieniu mojego programu?Wyświetl odliczanie dla funkcji uśpienia Pythona

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

a potem chcę to zrobić 10,9,8,7 ....

jest to możliwe?

+0

Dziękuję za wszystkie wspaniałe odpowiedzi. – user1681664

+0

powiązane: [odliczanie przy użyciu pętli zdarzeń Tkinter lub Gtk lub Twisted lub Asyncio] (http://stackoverflow.com/a/14040516/4279) – jfs

Odpowiedz

16

zawsze można zrobić

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

Ten fragment ma lekko irytujące cechę, że każdy numer zostanie wydrukowany na nowej linii. Aby tego uniknąć, można

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

dzięki, to jest świetne. masz tylko mały błąd, który naprawiłem. czas.spać (i) powinien być time.sleep (1) – user1681664

+1

Tak, rzeczywiście, jest ustalony dla odpowiedzi. – aestrivex

1

Jasne, wystarczy napisać pętlę, która drukuje 10 minus licznik iteracji, następnie go spać 1 sekundę każdej iteracji i prowadzony przez 10 iteracji. Albo, żeby być jeszcze bardziej elastyczne:

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) 
7

Można zrobić funkcję odliczania takiego:

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) 

Karetka powrót \r i przecinek , zachowa drukiem w tej samej linii (unikanie jedną linię dla każdej wartości odliczania)

Wraz ze zmniejszaniem się liczby sekund, pad_str zapewni, że ostatnia linia zostanie zastąpiona spacjami, zamiast pozostawić ostatni znak (y) za końcem skracania.

Ostateczny wydruk zastępuje ostatni komunikat stanu zakończoną wiadomością i zwiększa linię wyjściową, więc istnieją dowody opóźnienia.

1

Oto jeden zrobiłem:

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

Na koniec, jeśli i jeszcze można umieścić alarm lub cokolwiek.

1

time.sleep() może wrócić wcześniej, jeśli sen zostanie przerwany sygnałem lub później (w zależności od harmonogramu innych procesów/wątków według OS/tłumacza).

Aby poprawić dokładność na wielu iteracji, aby uniknąć dryfu dla dużej liczby iteracji, odliczanie może być zablokowana z zegarem:

#!/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) 
+0

to jest dokładniejszy sen, dzięki – wukong

1

To jest coś, że nauczyłem się w jednym z mojego pierwszego pytona lekcje, graliśmy z [ "/", "-", "|", "\", "|"], ale zasada jest ta sama:

import time 

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

jest to najlepszy sposób, aby wyświetlić stoper w konsola do 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") 

Powoduje zapisanie poprzedniego wiersza w każdym cyklu.