每次试验的 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()
,您可以刷新该缓冲区。
- 在内部 for 循环下缩进内容。
- 将您的
event.clearEvents()
移动到 while
循环之前
或者在 core.wait
之后。这就是您开始收听新内容的地方
按键。在等待期间按下将返回
在下一个循环中调用 event.getKeys()
while 循环。这就是它立即移动光标的原因。没有
在你拥有它的地方拥有 event.clearEvents()
的真正原因
因为您只监听 while 循环中的事件。这就是为什么我
建议您移动它而不是插入一个新的。
- 启动心理刺激非常耗费资源
有时可能需要几百毫秒。没有
创建几个新的
ImageStims
和 TextStims
的原因
每次试验。
pos_absolute
和 seconds
是多余的。你只能用 seconds
.
- 风格的东西:而不是
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_list
、key
等几个看似不必要的重置
我制作了自己的评分量表,这是一个从 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()
,您可以刷新该缓冲区。
- 在内部 for 循环下缩进内容。
- 将您的
event.clearEvents()
移动到while
循环之前 或者在core.wait
之后。这就是您开始收听新内容的地方 按键。在等待期间按下将返回 在下一个循环中调用event.getKeys()
while 循环。这就是它立即移动光标的原因。没有 在你拥有它的地方拥有event.clearEvents()
的真正原因 因为您只监听 while 循环中的事件。这就是为什么我 建议您移动它而不是插入一个新的。 - 启动心理刺激非常耗费资源
有时可能需要几百毫秒。没有
创建几个新的
ImageStims
和TextStims
的原因 每次试验。 pos_absolute
和seconds
是多余的。你只能用seconds
.- 风格的东西:而不是
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_list
、key
等几个看似不必要的重置