【发布时间】:2013-06-17 16:37:41
【问题描述】:
我在我的程序中使用 time.sleep(10)。运行程序时可以在 shell 中显示倒计时吗?
>>>run_my_program()
tasks done, now sleeping for 10 seconds
然后我想让它做 10,9,8,7....
这可能吗?
【问题讨论】:
标签: python time sleep stopwatch countdowntimer
我在我的程序中使用 time.sleep(10)。运行程序时可以在 shell 中显示倒计时吗?
>>>run_my_program()
tasks done, now sleeping for 10 seconds
然后我想让它做 10,9,8,7....
这可能吗?
【问题讨论】:
标签: python time sleep stopwatch countdowntimer
你总是可以的
#do some stuff
print 'tasks done, now sleeping for 10 seconds'
for i in xrange(10,0,-1):
time.sleep(1)
print i
这个 sn-p 有一个有点烦人的功能,即每个数字都打印在换行符上。为避免这种情况,您可以
import sys
import time
for i in xrange(10,0,-1):
sys.stdout.write(str(i)+' ')
sys.stdout.flush()
time.sleep(1)
【讨论】:
NameError: name 'xrange' is not defined,请改用range。它在 Python 3 中被重命名。
这是在 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")
这会覆盖每个周期的前一行。
【讨论】:
你可以做一个倒计时功能,比如:
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 将确保最后一行被空格覆盖,而不是在输出缩短时留下最后一个字符。
最后的打印用 done 消息覆盖最后的状态消息并增加输出行,因此有延迟的证据。
【讨论】:
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),)。
从控制台清除最后一个数字的简单解决方案:
import time
for i in range(10,0,-1):
print(f"{i}", end="\r", flush=True)
time.sleep(1)
默认情况下,打印函数设置end="\n",这意味着后续的打印调用将打印在新行上。您可以将其更改为 end="\r" 以在每次调用后替换输出。 (How does carriage return "\r" work in python)。
此外,使用flush 意味着您不必担心缓冲问题。 (What does print()'s flush do?)
看起来是这样的:
【讨论】:
这是我在第一堂 Python 课程中学到的东西,我们用 ["/","-","|","\","|"] 玩,但原理是一样的:
import time
for i in reversed(range(0, 10)):
time.sleep(1)
print "%s\r" %i,
【讨论】:
这是我做的:
import time
a = input("How long is the countdown?")
while a != 0:
print a
time.sleep(1)
a = a-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)
【讨论】:
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)
【讨论】:
这是亚秒级精度:
print()
_k = 0.5 # ensure k != _k first time round (as k will be integer)
print('Starting in ')
while _k > 0:
k = round(event_timestamp - time())
if k != _k:
print(f'\r{k} ', end='', flush=True)
_k = k
sleep(0.1)
print('boom')
注意f'\r{k} ' 中的尾随空格。所以如果我们从100 到99 或10 到9 它会清除第二个数字。
也不需要import sys。
sleep(0.0003) 如果你想要毫秒精度。
【讨论】:
如果你不限制自己睡觉,那么(礼貌automatetheboringstuff),pyautogui 有一个漂亮的倒计时功能:
import pyautogui
print('Starting in ', end=''); pyautogui.countdown(3)
【讨论】:
另一种无需重新发明轮子的简单方法是使用tqdm,它会自动显示进度条:
from time import sleep
from tqdm import tqdm
for _ in tqdm(range(10)):
sleep(1)
然后,您可以根据需要修改加载栏的显示。
【讨论】: