Вопрос по countdowntimer, python, stopwatch, sleep, time – Показать обратный отсчет для функции сна Python

10

Я использую time.sleep (10) в моей программе. Можно ли отобразить обратный отсчет в оболочке при запуске моей программы?

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

а то я хочу это сделать 10,9,8,7 ....

Это возможно?

Спасибо за все замечательные ответы. user1681664

Ваш Ответ

7   ответов
1

Конечно, просто напишите цикл, который печатает 10 минус счетчик итераций, затем дайте ему поспать 1 секунду каждую итерацию и запустить в течение 10 итераций. Или, чтобы быть еще более гибким:

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

Это то, что ямы учились на одном из моих первых уроков по питону, мы играли с ["/", "-", "|", "\", "|"] но принцип тот же:

import time

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

Это лучший способ отобразить таймер в консоли для 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")

Это записывает поверх предыдущей строки в каждом цикле.

1

Вот'один я сделал:

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

В конце концов, если вы и еще вы можете поставить будильник или что-то еще.

7

Вы можете сделать функцию обратного отсчета, как:

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)

Возврат каретки\r и запятая, будет держать печать в одной строке (избегая одной строки для каждого значения обратного отсчета)

По мере уменьшения количества секунд pad_str будет гарантировать, что последняя строка будет перезаписана пробелами, вместо того, чтобы оставить последний символ (ы) после сокращения выходных данных.

Окончательная печать перезаписывает последнее сообщение о состоянии сообщением «Готово» и увеличивает строку вывода, что свидетельствует о задержке.

Чтобы предотвратить добавление новой строки каждую секунду в обратном отсчете, операторprint '%s for the next %d seconds %s\r' % (msg, i, pad_str), должен быть изменен на.sys.stdout.write( '%s for the next %d seconds %s\r' % (msg, i, pad_str),) Jack Fleeting
17

ты всегда мог сделать

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

Этот фрагмент имеет немного раздражающую особенность - каждый номер печатается на новой строке. Чтобы избежать этого, вы можете

import sys
import time
for i in xrange(10,0,-1):
    sys.stdout.write(str(i)+' ')
    sys.stdout.flush()
    time.sleep(1)
Да, действительно, это исправлено для ответа. aestrivex
спасибо, это здорово у вас есть только маленькая ошибка, которую я исправил. time.sleep (i) должен быть time.sleep (1) user1681664
1

time.sleep() может вернуться раньше, если сон прерывается сигналом или позже (зависит от планирования других процессов / потоков ОС / интерпретатором).

Чтобы повысить точность в течение нескольких итераций, чтобы избежать смещения при большом количестве итераций, обратный отсчет может быть заблокирован часами:

#!/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)
это более точный сон, спасибо wukong

Похожие вопросы