Python中的多个计时器(Pygame)

时间:2012-11-17 07:45:46

标签: python time pygame

我是一名业余程序员。我正在尝试编写一个简单的程序来测量一系列用于生物学实验的视觉刺激(正方形闪光)的反应时间。这是我的代码(注意,第一次编写图形界面):

stimulus = pygame.Rect(100,250,100,100)

#draw on surface object
time.sleep(2) #wait for 2 seconds before it appears
screen.fill(BLACK)
pygame.draw.rect(screen,WHITE,stimulus)
pygame.display.update(stimulus)

#record time stimulus appeared
t0 = time.clock()

#clear screen ("flash" illusion)
time.sleep(0.5) #***PROBLEM***
screen.fill(BLACK)
pygame.display.update(stimulus) 


while True:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            t1 = time.clock()
            print t1-t0
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

程序运行正常,然后我将标记为“问题”的行包含在该块中。印刷的反应时间似乎合理。但是,我希望广场在一段时间后消失,就好像它只是“闪现”一样。包含time.sleep(0.5)后,打印时间不再正确。无论我按多快,它总是0.5xxxx或更高。有没有解决方法?

P.S。我需要它消失,因为我想呈现一系列闪烁,其间有预定的(非常数)暂停。

感谢。

修改

我需要做两件事: 1.形状必须在屏幕上闪烁0.5秒。 2.每次按下空格键时,程序必须创建一个时间戳(例如写入列表)(即使在两次闪烁之间随机按两次)。

2 个答案:

答案 0 :(得分:1)

您的问题是由于您标记为问题的线路,计算机将在0.5秒内无所事事。您需要做的是使它可以在正方形仍然显示时注册反应。不要使用time.sleep(0.5),而是将其放在:

while time.clock()-t0<0.5:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            t1 = time.clock()
            print t1-t0

这应该可以修复您的代码。

答案 1 :(得分:1)

使用pygame.time.get_ticks(),它提供自pygame.init

以来经过的毫秒数

编辑:

如果您在首次显示形状时保存get_ticks值,则每个keydown都会在列表中附加当前get_ticks

for press in press_times:
    print "milliseconds: {}".format(press - time_start)

毫秒意味着500相当于0.5秒。