【发布时间】: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秒,但不提供其他保证。通常操作系统需要一些额外的毫秒,但这取决于正在运行的进程。 -
哦,我现在明白了。这对我来说没问题。这只是学校的一个项目,所以它不需要非常准确。我只是想用我拥有的基本设备尽可能地精确。谢谢。