我想创建一个倒计时器,从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)
答案 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)