这是一个可靠的倒数计时器吗?

时间:2016-04-13 07:05:09

标签: python python-2.7 python-3.x

我想创建一个倒计时器,从60分钟开始倒计时直到达到0.我不需要它准确无误。就在10-15秒之内。 time.sleep是正确的工作任务吗?

while(hour + minute != 0):

        if minute == 0:
                minute = 59
                hour = hour - 1
        else:
                minute = minute - 1
        time.sleep(1)

3 个答案:

答案 0 :(得分:2)

我认为通过区分分钟和秒来使你过度复杂化。使用基本单位(秒),然后在总数上向后循环并在那里应用延迟,例如:

nil

答案 1 :(得分:2)

不,time.sleep()无法提供可靠的时间。如果任何类型的信号中断睡眠,它可以短暂睡眠,但根据您的系统负载,它也可以更长。

我建议您在开始倒计时时存储当前时间,例如time.time()(将当前时间作为自纪元以来的秒数返回浮点十进制数):

start_time = time.time() 

然后计算倒计时结束时的时间(当然也是自纪元以来的秒数):

target_time = start_time + (hours * 60 + minutes) * 60 + seconds

现在您可以启动while循环,检查当前时间是否低于target_time。如果是这种情况,您可以使用time.sleep(RESOLUTION)来节省CPU时间。您的倒计时将与您选择的RESOLUTION一样精确:它的运行时间总是大于或等于所需的时间,但低于所需的时间加RESOLUTION。我会选择0.1到1秒之间的值。

这是完整的代码:

start_time = time.time() 
target_time = start_time + (hours * 60 + minutes) * 60 + seconds

while target_time < time.time():

    # do something, e.g. print the remaining time:
    remaining_time = target_time - time.time()
    print("Countdown: {}h {}min {}s remaining".format(
            remaining_time // 3600, remaining_time // 60, remaining_time % 60))

    # sleep a bit to save CPU resources
    time.sleep(0.5)

优点是即使系统负载很高,或者你在while循环中做的事情需要很长时间,倒计时仍然保持相当准确。

答案 2 :(得分:1)

简单的方法是使用divmod。想法是在休息一秒后减少计数器1秒钟。

def counter(total_seconds):
    for rem in range(total_seconds, 0, -1):
        mins, secs = divmod(rem, 60)
        print('{}mins and {}secs remaining'.format(mins, secs))
        time.sleep(1)