【问题标题】:Multiple timers in Python (Pygame)Python中的多个计时器(Pygame)
【发布时间】:2012-11-17 07:45:46
【问题描述】:

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

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 或更大。有什么解决办法吗?

附:我需要它消失,因为我想呈现一系列闪烁,其间有预定的(非恒定的)停顿。

谢谢。

编辑

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

【问题讨论】:

  • 没有完美的计时精度。当您调用 time.sleep 时,操作系统会将进程置于挂起状态,然后当 至少 0.5 秒过后,中断将唤醒操作系统,这将使您的程序处于运行状态。如果您想要几乎完美的计时,您应该使用特殊的实时操作系统。
  • 你能发布SSCCE的代码吗?这会让人们更容易帮助你。名称屏幕、BLACK、WHITE、KEYDOWN 尚未导入或定义,因此我无法运行您的代码。
  • @Bakuriu 对运行 Python 的“实时操作系统”有什么建议吗?谢谢。
  • 没有任何运行 Python 的实时操作系统。通常这种操作系统用于微控制器、飞机芯片等,它们必须做“简单”的任务,但时间很关键,即使在这些系统上,事件的时间也不能完美,它们有一定的时间——保证它们发生的时期。我想说的是,如果您执行sleep(0.5),您只能知道时间至少相差0.5 秒,但不提供其他保证。通常操作系统需要一些额外的毫秒,但这取决于正在运行的进程。
  • 哦,我现在明白了。这对我来说没问题。这只是学校的一个项目,所以它不需要非常准确。我只是想用我拥有的基本设备尽可能地精确。谢谢。

标签: python time pygame


【解决方案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. 形状必须在屏幕上闪烁 0.5 秒。 2.程序必须在每次按下空格键时创建一个时间戳(例如写入列表)(即使在两次闪烁之间随机按下两次)。
  • @Jey 这将实现这两​​件事。由于第一行的while循环,它只会检查是否按下键0.5秒,然后清除屏幕。您已经拥有的代码将处理第二项。试试吧,你会看到的。
  • 使用这个答案,除了 time.clock() 是什么?确保它返回自 init 以来的毫秒数,例如 get_ticks 而不是自上次调用以来,例如 Clock.tick
  • 哇,你是对的,它有效!我真的不明白while循环在做什么。我想我现在明白了:它“暂停”程序 0.5 秒,它允许你注册按键,不像 time.sleep。谢谢。 @monkey 这是我发现的关于time.clock 谢谢。
【解决方案2】:

使用pygame.time.get_ticks(),它给出了自pygame.init以来经过的毫秒数

编辑:

如果您在第一次显示形状时保存get_ticks 值,那么每次按下键时,将当前get_ticks 附加到您的列表中。

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

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

【讨论】:

  • 这比 time.clock 或 time.time 更精确吗?
  • @Jey 实际上不太精确。不要使用它。
猜你喜欢
  • 2015-03-07
  • 2015-08-23
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
相关资源
最近更新 更多