每次试验的 psychopy 重置变量

psychopy reset variable for each trial

我制作了自己的评分量表,这是一个从 0 到 28:18 的时间轴。它根据人们在每次试验中按下 't' 或 'b' 键的速度而移动。屏幕上出现的内容如下所示:

我希望每次试用时顶部的时间都重置为 14:09。每次试验后有 0.5 秒的试验间隔,在此期间屏幕上会显示“+”。我遇到的问题是,如果您在 ITI 期间按 't' 或 'b',下一次试验将不会在 14:09 开始。相反,它将按 't' 或 'b' 按下移动时间线的方向移动。这是我尝试更正的当前代码:

prevPos = 0
trialNum=0
b_list=[]
t_list=[]
key=[]

# loop through pictures
for eachPic in catPictures:
    b_list=[]
    t_list=[]
    timer = core.CountdownTimer(TrialDuration)
    while timer.getTime() > 0:
        for key in event.getKeys():
            if key in ['escape']:
                core.quit() # quit if they press escape
            if key in ['b']:
                # add keypress to list for each keypress. then move cursor proportionally to length of this list
                b_list.append(key)
                prevPos+=len(b_list)
            if key in ['t']:
                t_list.append(key)
                prevPos-=len(t_list)

    # set upper and lower limits to where cursor can go (which will later be halved to restrict range of cursor on the screen)
        if prevPos <= -849:
            prevPos = -849
        elif prevPos >=849:
            prevPos = 849
        # make absolute position so pos_absolute becomes a range from 0 to 300 (based on 28:18 min movie)
        pos_absolute = prevPos + 849
        # need to have range of 1698 (# of seconds in 28:18)
        # need to have range of 1698 (# of seconds in 28:18)
        # current range is 0 to 849 (which is 50% of 1698)
        seconds =  pos_absolute

        Image2 = visual.ImageStim(window)
        #curbImage2.setSize = ((0.5,0.5), units = 'norm')
        # make a little higher than the absolute middle
        Image2.setPos([0,100])
        # use each image (i in curbImages)
        Image2.setImage(catPictures[trialNum])

        # define cursor that moves along timeline
        cursorImage = visual.ImageStim(window)
        cursorImage.setImage(directoryStim+'cursor.png')
        # make cursor move by however big prevPos is
        cursorImage.setPos([int(prevPos)*.5,int(400)])
        # make the line
        timeline = visual.SimpleImageStim(win=window, image=directoryStim+'line.png', units='pix', pos=[0, 400])
    event.clearEvents() # get rid of other, unprocessed events

        # print min and max values next to timeline
        min = visual.TextStim(window, '0:00', color='Black', pos=[-500, 400])
        max = visual.TextStim(window, '28:18', color='Black', pos=[500, 400])
        # print constantly updating time value
        timeText = visual.TextStim(window,'%d:%02d' % (seconds/60, seconds % 60),color='Black',wrapWidth=1080,font='Verdana', pos=[0,465], height=50)

        ## now put everything on the screen
        Image2.draw(window)
        min.draw(window)
        max.draw(window)
        timeText.draw(window)
        timeline.draw(window)
        cursorImage.draw(window)
    ## flip so it actually appears
        window.flip()

    ITI = visual.TextStim(window, '+', pos=[0,0], height=50, color='Black')
    ITI.draw(window)
    window.flip()
    core.wait(.5,.5)
    trialNum+=1
    prevPos = 0
    b_list =[]
    t_list=[]
    key=[] 

如何在每次试验开始时将我的时间线重置为 14:09(又名 prevPos = 0),即使人们按 't' 或 'b'在试验结束时或在试验间隔期间?

在代码的最后一行,试试这个:

event.clearEvents()

在 ITI 期间按下的键将进入缓冲区,因此将在您下次调用 event.getKeys() 时收集。通过调用 clearEvents(),您可以刷新该缓冲区。

  1. 在内部 for 循环下缩进内容。
  2. 将您的 event.clearEvents() 移动到 while 循环之前 或者在 core.wait 之后。这就是您开始收听新内容的地方 按键。在等待期间按下将返回 在下一个循环中调用 event.getKeys() while 循环。这就是它立即移动光标的原因。没有 在你拥有它的地方拥有 event.clearEvents() 的真正原因 因为您只监听 while 循环中的事件。这就是为什么我 建议您移动它而不是插入一个新的。
  3. 启动心理刺激非常耗费资源 有时可能需要几百毫秒。没有 创建几个新的 ImageStimsTextStims 的原因 每次试验。
  4. pos_absoluteseconds 是多余的。你只能用 seconds.
  5. 风格的东西:而不是 stim.setPos(x) 你现在可以对所有其他属性做 stim.pos = x 等等。这是从现在开始设置刺激属性的首选方式(更简洁的代码并允许对属性进行更多操作)。

这是经过上述更改后的清理代码:

# Stimuli
Image2 = visual.ImageStim(window)
cursorImage = visual.ImageStim(window)
min = visual.TextStim(window, '0:00', color='Black', pos=[-500, 400])
max = visual.TextStim(window, '28:18', color='Black', pos=[500, 400])
timeText = visual.TextStim(window,color='Black',wrapWidth=1080,font='Verdana', pos=[0,465], height=50)
ITI = visual.TextStim(window, '+', pos=[0,0], height=50, color='Black')
timeline = visual.SimpleImageStim(win=window, image=directoryStim+'line.png', units='pix', pos=[0, 400])
timer = core.CountdownTimer(TrialDuration)

# loop through pictures
trialNum=0
for eachPic in catPictures:
    prevPos = 0
    key=[]
    b_list=[]
    t_list=[]
    timer.reset()
    event.clearEvents() # get rid of other, unprocessed events
    while timer.getTime() > 0:
        for key in event.getKeys():
            if key in ['escape']:
                core.quit() # quit if they press escape
            if key in ['b']:
                # add keypress to list for each keypress. then move cursor proportionally to length of this list
                b_list.append(key)
                prevPos+=len(b_list)
            if key in ['t']:
                t_list.append(key)
                prevPos-=len(t_list)

        # set upper and lower limits to where cursor can go (which will later be halved to restrict range of cursor on the screen)
        if prevPos <= -849:
            prevPos = -849
        elif prevPos >=849:
            prevPos = 849
        # make absolute position so pos_absolute becomes a range from 0 to 300 (based on 28:18 min movie)
        # need to have range of 1698 (# of seconds in 28:18)
        # need to have range of 1698 (# of seconds in 28:18)
        # current range is 0 to 849 (which is 50% of 1698)
        seconds =  prevPos + 849

        #curbImage2.size = ((0.5,0.5), units = 'norm')
        # make a little higher than the absolute middle
        Image2.pos = [0,100]
        # use each image (i in curbImages)
        Image2.image = catPictures[trialNum]

        # define cursor that moves along timeline
        cursorImage.image = directoryStim+'cursor.png'
        # make cursor move by however big prevPos is
        cursorImage.pos = [int(prevPos)*.5,int(400)]
        timeText.text = '%d:%02d' % (seconds/60, seconds % 60))

        ## now put everything on the screen
        Image2.draw(window)
        min.draw(window)
        max.draw(window)
        timeText.draw(window)
        timeline.draw(window)
        cursorImage.draw(window)
        ## flip so it actually appears
        window.flip()

    ITI.draw(window)
    window.flip()
    core.wait(.5,.5)
    trialNum+=1

请注意,我还删除了 b_listkey 等几个看似不必要的重置