2015-08-31 4 views
2

Я сделал свою собственную рейтинговую шкалу, которая является временной шкалой от 0 до 28:18. Он движется в соответствии с тем, как быстро люди нажимают клавиши «t» или «b» для каждого испытания. Что приходит на экране выглядит следующим образом:переменная сброса психопата для каждого испытания

experiment http://i58.tinypic.com/2hhgoj7.png

Я хочу, чтобы время, в верхней части, чтобы сбросить в 14:09 для каждого испытания. После каждого испытания проходит промежуточный интервал времени в 0,5 секунды, в течение которого на экране отображается символ «+». Проблема, с которой я сталкиваюсь, заключается в том, что если вы нажмете 't' или 'b' во время ITI, следующее испытание не начнется в 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» по завершении проб или во время интервала между испытаниями?

+1

Не могли бы вы еще раз взглянуть на ваш отступа? – ballsatballsdotballs

+2

Всюду вы воссоздаете объекты на каждой итерации цикла.Это время неэффективно (для инициализации объекта требуется намного больше времени, чем при обновлении его атрибутов). например 'timer = core.CountdownTimer (TrialDuration)' должен располагаться в верхней части кода и в его текущем местоположении просто иметь строку 'timer.reset()'. Аналогичным образом сдвиньте создание каждого изображения, например. 'Image2 = visual.ImageStim (window)', в верхней части кода и внутри цикла вам нужно только «Image2.setImage (catPictures [trialNum])». Другие изображения являются постоянными, поэтому их следует создавать только один раз. –

+1

Плюс один для китте. Вы знаете, как привлечь внимание Интернета. – mmagnuski

ответ

1
  1. Отступы под внутренним контуром.
  2. Передвиньте свой event.clearEvents() прямо перед вашим while -loop или после core.wait. Именно здесь вы начинаете слушать новые нажатия клавиш . Прессы в течение периода ожидания будут возвращены на следующим звонком до event.getKeys() в следующем цикле цикла . Вот почему он немедленно перемещает курсор. Нет никакой реальной причины иметь event.clearEvents(), где у вас есть , поскольку вы только слушаете события в цикле while. Вот почему я предлагает вам переместить его, а не вставлять новый.
  3. Инициирующие психотические стимулы довольно сильно затянуты в исходное состояние и могут иногда занимать несколько сотен миллисекунд. Нет причины для создания нескольких новых ImageStims и TextStims на каждой пробной версии.
  4. pos_absolute и seconds являются излишними. Вы можете сделать только с 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_list, key и т.д.

+0

удивительный, спасибо !! FYI, единственное, что мне пришлось изменить, чтобы заставить его работать, это отступы цикла for после цикла while (до раздела ITI, это было плохо в исходном коде) и удалить скобки из того места, где вы определяете 'timeText'. вы очистили его совсем немного, спасибо! – Maria

+0

Прохладный. Я забыл переместить 'timeline'' и' 'timer''. Я обновил код ответа с этим. Также отступы внутренней петли. См. Также новые пункты 4 и 5 с несколькими дополнительными предложениями. –

1

В последней строке коды, попробуйте следующее:

event.clearEvents()

клавиша нажата во время ITI собирается в буфер и так будет собираться в следующий раз, когда вы называете event.getKeys(). Вызвав clearEvents(), вы очищаете этот буфер.