【问题标题】:Display a countdown for the python sleep function显示 python sleep 函数的倒计时
【发布时间】: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


【解决方案1】:

你总是可以的

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

【讨论】:

  • 谢谢,太好了。你有一个我修正的小错误。 time.sleep(i) 应该是 time.sleep(1)
  • 是的,确实,答案是固定的。
  • 如果您收到NameError: name 'xrange' is not defined,请改用range。它在 Python 3 中被重命名。
【解决方案2】:

这是在 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")

这会覆盖每个周期的前一行。

【讨论】:

    【解决方案3】:

    你可以做一个倒计时功能,比如:

    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),)
    【解决方案4】:

    从控制台清除最后一个数字的简单解决方案:

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

    看起来是这样的:

    【讨论】:

      【解决方案5】:

      这是我在第一堂 Python 课程中学到的东西,我们用 ["/","-","|","\","|"] 玩,但原理是一样的:

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

      【讨论】:

        【解决方案6】:

        这是我做的:

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

        最后,如果你和其他人你可以设置警报或其他任何东西。

        【讨论】:

          【解决方案7】:

          当然,只需编写一个循环,打印 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)
          

          【讨论】:

            【解决方案8】:

            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)
            

            【讨论】:

              【解决方案9】:

              这是亚秒级精度:

                  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} ' 中的尾随空格。所以如果我们从10099109 它会清除第二个数字。

              也不需要import sys

              sleep(0.0003) 如果你想要毫秒精度。

              【讨论】:

                【解决方案10】:

                如果你不限制自己睡觉,那么(礼貌automatetheboringstuff),pyautogui 有一个漂亮的倒计时功能:

                import pyautogui
                print('Starting in ', end=''); pyautogui.countdown(3)
                

                【讨论】:

                  【解决方案11】:

                  另一种无需重新发明轮子的简单方法是使用tqdm,它会自动显示进度条:

                  from time import sleep
                  from tqdm import tqdm
                  
                  for _ in tqdm(range(10)):
                      sleep(1)
                  

                  然后,您可以根据需要修改加载栏的显示。

                  【讨论】:

                    猜你喜欢
                    • 2021-05-29
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-04-21
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多