11

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

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
4

12 回答 12

12

我会用这样的东西:

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

请注意尾随逗号,因此不会打印新行。

于 2013-04-04T05:08:19.887 回答
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
于 2015-11-12T21:06:00.133 回答
0

在我的电脑(Windows 7)上,当在cmd窗口中运行时,这个程序几乎完全按照你说的那样工作。如果计时器每秒在新行上重复,这对我来说表明这os.system ('cls')对你不起作用——也许是因为你在 Windows 以外的操作系统上运行?

该语句while s<=60:似乎是不正确的,因为s在该测试中永远不会等于 60——只要它达到 60,它就会重置为 0 并m递增。也许测试应该是while m<60:

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

于 2013-04-04T05:11:55.723 回答
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="")
于 2013-04-04T05:14:46.590 回答
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)

那应该可以解决您的问题。

于 2015-03-18T14:04:28.570 回答
0
# Timer
import time
import winsound
print "               TIMER"
#Ask for Duration
Dur1 = input("How many hours?  : ")
Dur2 = input("How many minutes?: ")
Dur3 = input("How many seconds?: ")
TDur = Dur1 * 60 * 60 + Dur2 * 60 + Dur3
# Ask to Begin
start = raw_input("Would you like to begin Timing? (y/n): ")
if start == "y":
    timeLoop = True

# Variables to keep track and display
CSec = 0
Sec = 0
Min = 0
Hour = 0
# Begin Process
timeLoop = start
while timeLoop:
    CSec += 1
    Sec += 1
    print(str(Hour) + " Hours " + str(Min) + " Mins " + str(Sec) + " Sec ")
    time.sleep(1)
    if Sec == 60:
        Sec = 0
        Min += 1
        Hour = 0
        print(str(Min) + " Minute(s)")
    if Min == 60:
        Sec = 0
        Min = 0
        Hour += 1
        print(str(Hour) + " Hour(s)")
    elif CSec == TDur:
        timeLoop = False
        print("time\'s up")
        input("")
    while 1 == 1:
        frequency = 1900  # Set Frequency To 2500 Hertz
        duration = 1000  # Set Duration To 1000 ms == 1 second
        winsound.Beep(frequency, duration)

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

于 2018-04-01T09:44:15.713 回答
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
于 2021-04-07T22:46:19.407 回答
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")
于 2020-04-08T13:42:33.930 回答
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

所以,我非常想有一个计时器,但同时记录我按了多少次回车。

于 2021-02-01T05:02:43.593 回答
-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))
于 2018-01-21T16:14:01.363 回答
-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 来添加声音。

于 2018-01-22T14:16:08.350 回答
-1

我有一个更好的方法:

import time
s=0
m=0
while True:
  print(m,  'minutes,', s, 'seconds')
  time.sleep(0.999999999999999999999) # the more 9s the better
  s += 1
  if s == 60:
    s=0
    m += 1
于 2020-01-20T05:09:05.993 回答