PsychoPy Builder: 如何在每次按键时更新屏幕?

3 投票
1 回答
2475 浏览
提问于 2025-04-18 04:57

我想在每次被试按下一个键的时候,显示不同的文本,具体显示什么取决于按下的是哪个键,并且我只希望特定的键可以进入下一个试验。

举个例子,屏幕上应该显示“5”,然后如果被试按下向下键,它就变成“4”;如果按下向上键,它就变成“6”,等等。但是如果他们按下回车键,我们就进入下一张幻灯片。

我该怎么做呢?

我到目前为止尝试过的

我一直在使用构建视图来创建一个大致的框架,然后再单独调整代码。我尝试插入一个这样的循环:

inloop=True
while inloop:
    print "in the loop"
    if event.getKeys('return'):
        inloop = False
        continueRoutine=False
    elif event.getKeys('left'):
        print "left key pressed"
    elif event.getKeys('right'):
        print "right key pressed"
    elif event.getKeys('escape'):
         core.quit()

如果我把这个放在我想要这种行为的例程的ContinueRoutine循环里面,我就无法看到“在循环中”或者其他打印语句的输出,这看起来像是没有进入循环。我也尝试把它放在其他地方,但遇到类似的问题。你觉得应该把这样的循环放在哪里?这样的方法解决这个问题合适吗?

1 个回答

5

总的来说,从长远来看,把代码放在一个构建器代码组件里会更简单。因为一旦你从构建器转到编码,修改过的代码是无法再回到构建器里的。或者你也可以选择完全用代码,这样的话建议你从头开始写。

你的实现

关于你当前代码为什么不工作的几点说明:

  1. 每次调用event.getKeys()时,默认会删除之前的响应。所以像你这样在每一帧都调用它,会导致后面的调用没有任何结果。
  2. event.getKeys()需要一个列表作为参数,而你给的是一个字符串。如果你想监听一个单独的按键,应该用['return']而不是'return'。

还有一个建议是为了提高时机的准确性(和概念的清晰度):如果在等待按键时画面是静止的,我建议你使用waitKeys,这样只有在按键时才会有反应。这样相较于getKeys()会更准确,因为getKeys()在放在win.flip()的循环中时是与帧锁定的。

解决方案

所以你可以在下面的代码组件中这样做:

while True:  # Yes, continue listening forever...
   resp_key = event.waitKeys(keyList=['left','right','up','down','return'])[0]  # pick first and only response.

   # Set different texts dependent on received response
   if resp_key == 'left':
      yourTextStimulus.text = '5'
   elif resp_key == 'right':
      yourTextStimulus.text = '7'
   elif resp_key == 'up':
      yourTextStimulus.text = '2'
   
   # .. or break out of the loop if return was pressed
   elif resp_key == 'return':
      break  # oh, do NOT continue forever... we're finished on return :-)
   # Actually show text if loop was not ended
   yourTextStimulus.draw()
   win.flip()

把"yourTextStimulus"改成你文本的名字。当然你可以根据需要调整更多或不同的按键,并让实际的字符串(目前是'5','7','2')根据试验而变化。

撰写回答