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