每个试验的心理复位变量

问题描述 投票:2回答:2

我制定了自己的评分标准,这是一个从0到28:18的时间表。它根据人们每次尝试按下“ t”或“ b”键的速度而变化。屏幕上显示的内容如下所示:

experiment

我希望每次试用都将顶部时间重置为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=[] 

即使人们在试验结束时或在试验间间隔中按't'或'b',在每次试验开始时如何将时间轴重置为14:09(akaprevPos= 0)?

python timeline psychopy
2个回答
1
投票
  1. 缩进内部for循环中的内容。
  2. event.clearEvents()移到while循环之前或在core.wait之后。那是您开始聆听新音乐的地方按键。等待期间的按键将返回到在下一个周期的下一次调用event.getKeys()而环。这就是为什么它会立即移动光标。没有啦将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等的一些看似不必要的重置


1
投票

在代码的最后一行,请尝试以下操作:

event.clearEvents()

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

© www.soinside.com 2019 - 2024. All rights reserved.