如何在Python中制作计时器程序

时间:2013-04-04 04:30:52

标签: python timer

这是我的目标:制作一个以问候语开头的小程序(基于文本),打印一个计时器,记录自上次事件以来的时间,然后打印事件的计时器。 我已经使用这段代码开始尝试找出一个计时器,但我的第一个问题是计时器在每一个新的秒钟上不断重复新的一行。我如何让它停下来?此外,这个计时器似乎落后于实际秒钟。

import os
import time


s=0
m=0

while s<=60:
    os.system('cls')
    print (m, 'Minutes', s, 'Seconds')
    time.sleep(1)
    s+=1
    if s==60:
        m+=1
        s=0

11 个答案:

答案 0 :(得分:6)

我会选择这样的东西:

import time
import sys

time_start = time.time()
seconds = 0
minutes = 0

while True:
    try:
        sys.stdout.write("\r{minutes} Minutes {seconds} Seconds".format(minutes=minutes, seconds=seconds))
        sys.stdout.flush()
        time.sleep(1)
        seconds = int(time.time() - time_start) - minutes * 60
        if seconds >= 60:
            minutes += 1
            seconds = 0
    except KeyboardInterrupt, e:
        break

这里我依靠的是实际的时间模块,而不仅仅是睡眠增量,因为睡眠不会是1秒钟。

此外,您可以使用print代替sys.stdout.write,但您几乎肯定还需要sys.stdout.flush

像:

print ("\r{minutes} Minutes {seconds} Seconds".format(minutes=minutes, seconds=seconds)),

请注意尾随逗号,以便不打印新行。

答案 1 :(得分:2)

这是我的版本。这对初学者来说很棒。

     # Timer
import time
print("This is the timer")
# Ask to Begin
start = input("Would you like to begin Timing? (y/n): ")
if start == "y":
    timeLoop = True

# Variables to keep track and display
Sec = 0
Min = 0
# Begin Process
timeLoop = start
while timeLoop:
    Sec += 1
    print(str(Min) + " Mins " + str(Sec) + " Sec ")
    time.sleep(1)
    if Sec == 60:
        Sec = 0
        Min += 1
        print(str(Min) + " Minute")
# Program will cancel when user presses X button

答案 2 :(得分:0)

cmd窗口中运行时,在我的PC(Windows 7)上,此程序几乎完全按照您的说法运行。如果计时器每秒重复一行,那表明os.system ('cls')对你不起作用 - 也许是因为你在Windows以外的操作系统上运行?

语句while s<=60:似乎不正确,因为s在该测试中永远不会等于60 - 无论何时达到60,它都会重置为0并且m会增加。也许测试应该是while m<60:

最后,在我的电脑上,计时器看起来并没有落后于实际秒钟。不可避免地,这段代码会在时钟上滞后几秒 - 即,除while之外的time.sleep(1)循环中运行所有代码行所需的时间长,加上返回过程的任何延迟从睡眠状态。在我的情况下,这根本不是很长,但是,如果运行该代码(由于某种原因)0.1秒(例如),与挂钟时间相比,计时器将最终运行10%。 @ sberry的答案提供了一种解决这个问题的方法。

答案 3 :(得分:0)

好的,我将从你的计时器落后的原因开始。

程序中发生的事情是time.sleep()调用“休眠”程序的操作1秒钟,一旦该程序再次开始执行。但是你的程序仍然需要时间来执行你告诉它要执行的所有其他命令,因此实际执行所有操作需要1s + Xs。虽然这是一个非常基本的解释,但基本上是你的计时器不同步的原因。

至于为什么要不断在新行上打印,print()函数有一个预定义的行尾字符,它附加到给定的任何字符串上。

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

你可以通过将end="YourThing"放在你的打印语句中来覆盖这一点

for x in range(3):
    print("Test", end="")

上面的示例在行的末尾附加一个空字符串,因此循环的输出将是

"TestTestTest"

至于解决你的计时器问题,你应该使用类似于

的东西
timePoint = time.time()

while True:

    #Convert time in seconds to a gmtime struct
    currentTime = time.gmtime(time.time() - timePoint))

    #Convert the gmtime struct to a string
    timeStr = time.strftime("%M minutes, %S seconds", currentTime)

    #Print the time string
    print(timeStr, end="")

答案 4 :(得分:0)

使用timeit模块为代码计时。然后相应地调整time.sleep(x)。例如,您可以使用以下之一:

import timeit
#Do all your code and time stuff and while loop
#Store that time in a variable named timedLoop
timer = 1- timedLoop

#Inside while loop:
   time.sleep(timer)

这将为你拥有的time.sleep以外的代码计时,并从1秒减去该值,并将睡眠这段时间。这将给出1秒的准确表示。另一种方法是减少工作量,但可能不那么准确:

#set up timeit module in another program and time your code, then do this:
#In new program:
timer = 1 - timerLoop
print timerLoop

运行程序,然后复制打印时间并将其粘贴到程序二中,即现在的程序。在time.sleep()中使用timerLoop:

time.sleep(timerLoop)

那应该解决你的问题。

答案 5 :(得分:0)

this->__randomGiveUp()

我的计时器基于user5556486的版本。您可以设置持续时间,并在上述持续时间结束后发出哔声,类似于Force Fighter的版本

答案 6 :(得分:0)

# This Is the Perfect Timer!(PS: This One Really Works!)
import sys
import time
import os

counter=0
s = 0
m = 0
n = int(input("Till How Many Seconds do you want the timer to be?: "))
print("")

while counter <= n:
    sys.stdout.write("\x1b[1A\x1b[2k")
    print(m, 'Minutes', s, 'Seconds')
    time.sleep(1)
    s += 1
    counter+=1
    if s == 60:
        m += 1
        s = 0

print("\nTime Is Over Sir! Timer Complete!\n")

答案 7 :(得分:0)

其他帖子中的想法很酷——但是,代码无法用于我想做的事情。

我喜欢人们想要减去时间的方式,这样你就不必有 time.sleep()

from datetime import datetime

timePoint = time.time()
count = 0
while (count < 10):
    timePoint2 = time.time()
    timePointSubtract = timePoint2 - timePoint
    timeStamp1 = datetime.utcfromtimestamp(timePointSubtract).strftime('%H:%M:%S')
    print(f'{count} and {timeStamp1}')
    val = input("")
    count = count + 1

所以,我很想有一个计时器,但同时要记录我按 Enter 的次数。

答案 8 :(得分:0)

这是我的答案。

import time
import sys

time_start = time.time()

hours = 0
seconds = 0
minutes = 0

while True:

    sys.stdout.write("\r{hours} Hours {minutes} Minutes {seconds} Seconds".format(hours=hours, minutes=minutes, seconds=seconds))
    sys.stdout.flush()
        
    if (seconds <= 59):
        time.sleep(1)
        seconds += 1

        if (minutes <= 59 and seconds == 59 + 1):
            minutes += 1

            if (minutes == 60 and seconds == 59 + 1 ):
                hours += 1
                minutes = 0
                seconds = 0

    else:
        seconds = 0

答案 9 :(得分:-1)

这似乎更容易:

#!/usr/bin/env python
from datetime import datetime as dt
starttime = dt.now()
input("Mark end time")
endtime = dt.now()
print("Total time passed is {}.".format(endtime-starttime))

答案 10 :(得分:-1)

一个简单的计时器程序,有声提醒你:

from time import sleep
import winsound
m = 0
print("""**************************
Welcome To FASTIMER®
**************************""")
while True:
    try:
        countdown = int(input("How many seconds:  "))
        break
    except ValueError:
        print("ERROR, TRY AGAIN")
original = countdown
while countdown >= 60:
    countdown -= 60
    m += 1
for i in range (original,0,-1):
    if m < 0:
        break
    for i in range(countdown,-2,-1):
        if i % 60 == 0:
            m-=1
        if i == 0:
            break
        print(m," minutes and ",i," seconds")
        sleep(1)
    if m < 0:
        break
    for j in range(59,-1,-1):
        if j % 60 == 0:
            m-=1          
        print(m," minutes and ",j," seconds")
        sleep(1)
print("TIMER FINISHED")
winsound.PlaySound('sound.wav', winsound.SND_FILENAME)

此程序使用time.sleep()等待一秒钟。它每60秒转换一分钟。声音仅适用于Windows,或者您可以安装pygame来添加声音。