我正在尝试使用pygame创建Tabata或HIIT计时器。基本上我想在几秒钟内向上和向下计数并显示已经过去或剩余的时间。我修改了http://www.pygame.org/project-Countdown-1237-.html
中找到的代码我在使用上面链接的标准代码进行准确的时间显示时遇到了问题。这根本不准确。在屏幕上更新的每一秒可能已经过了2秒。所以倒计时将是两倍。所以我修改了代码以获得更准确的时间计数。
首先,我不确定这是解决这个问题的最好方法。最终我会想要有上下计数器重复的轮数。我最大的问题是,大约2分钟后,时间已经过去了。所以真正的经过时间可能是2:00分钟,但是间隔定时器是落后一两秒。随着计时器继续运行,显示的时间继续落后于真实的经过时间n秒,它会继续变得更糟。任何帮助将不胜感激。我见过人们使用pygame.time但不确定是否让我更接近我需要完成的事情
由于
#!/usr/bin/env python
import time
import pygame
from pygame.locals import *
import sys, os
if sys.platform == 'win32' or sys.platform == 'win64':
os.environ['SDL_VIDEO_CENTERED'] = '1'
pygame.init()
Screen = max(pygame.display.list_modes())
icon = pygame.Surface((1,1)); icon.set_alpha(0); pygame.display.set_icon(icon)
pygame.display.set_caption("[Program] - [Author] - [Version] - [Date]")
Surface = pygame.display.set_mode(Screen,FULLSCREEN)
black = 0,0,0
red = 255,0,0
white = 255,255,255
green = 0,75,0
orange = 175,75,0
Font = pygame.font.Font("font.ttf",1000)
pygame.mouse.set_visible(False)
pygame.event.set_grab(True)
test = Font.render("0",True,(255,255,255))
width = test.get_width()
height = test.get_height()
totalwidth = 4.5 * width
timerCountDown = 1
timerCountUp = 1
preTimerCountdown = 1
def quit():
pygame.mouse.set_visible(True)
pygame.event.set_grab(False)
pygame.quit(); sys.exit()
def GetInput():
key = pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_ESCAPE: quit()
def CountUp(startTime,timeDuration,backgroundColor):
Surface.fill(backgroundColor)
start_pos = (Screen[0]/2)-(totalwidth/2)
currentTime = time.time()
elapsedTime = currentTime - startTime
displayTime = time.strftime('%M:%S', time.gmtime(elapsedTime)) #'%H:%M:%S'
pos = [start_pos,(Screen[1]/2)-(height/2)]
timeDuration = time.strftime('%M:%S', time.gmtime(timeDuration))
Surface.blit(Font.render(displayTime,True,(white)),pos)
pygame.display.flip()
if displayTime == timeDuration:
time.sleep(0)
#quit()
global timerCountUp
timerCountUp = 0
startTime = currentTime
def CountDown(startTime,timeDuration,backgroundColor):
Surface.fill(backgroundColor)
startTime = startTime +1
start_pos = (Screen[0]/2)-(totalwidth/2)
currentTime = time.time()
elapsedTime = currentTime - startTime
displayTime = timeDuration - elapsedTime
displayTime = time.strftime('%M:%S', time.gmtime(displayTime)) #'%H:%M:%S'
pos = [start_pos,(Screen[1]/2)-(height/2)]
timeDuration = time.strftime('%M:%S', time.gmtime(timeDuration + 1))
Surface.blit(Font.render(displayTime,True,(white)),pos)
pygame.display.flip()
if displayTime == "00:00":
global timerCountDown
timerCountDown = 0
startTime = currentTime
def main():
startTime = time.time()
Clock = pygame.time.Clock()
global timerCountUp
timerCountUp = 1
global timerCountDown
timerCountDown = 1
global preTimerCountdown
preTimerCountdown = 1
while True:
GetInput()
Clock.tick(60)
while timerCountUp != 0:
CountUp(startTime,7,green)
GetInput()
global timerCountDown
timerCountDown = 1
startTime = time.time()
while timerCountDown != 0:
CountDown(startTime,3,orange)
GetInput()
global timerCountUp
timerCountUp = 1
startTime = time.time()
if __name__ == '__main__': main()
答案 0 :(得分:3)
你的延迟来自2个地方。
对Clock.tick(60)
的调用会在几分之一秒内休眠,以确保每秒调用60次。在您的情况下,您应该删除它,因为您没有每帧调用此函数。
更大的延迟来自这样一个事实:每个函数调用都需要一些时间,而且你没有考虑到这一点。
你也在计时器结束时睡了1秒钟。这不准确。
我建议您跟踪计时器花了多少毫秒,然后从下一个计时器中减去它。