蟒蛇;在分句中的单词后添加空白屏幕

时间:2016-05-24 14:49:00

标签: python psychopy

我正在建立一个心理学实验,一次一个词地呈现句子,然后提出一个单独的词来收集回复。我对第一部分的输入是一个完整的句子,我在代码中分成单词并在每个帧上更新以在句子中显示当前单词300毫秒。现在我是一个编码菜鸟,我无法弄清楚每个单词出现后如何在300毫秒内添加空白屏幕。

句子:" John踢了桶#34; 分为单词,表示为:John(300ms)空白(300ms)踢(300ms)空白(300ms)等。

我已经包含了我的相关代码但不知何故无法弄清楚如何在更新单词之间获取空白屏幕。我尝试过创建一个空白屏幕图像并将其插入不同位置的循环中,但我无法弄明白。非常感谢帮助!

    # get the sentence for this trial and split it into a list of words:
words = Sentence.split() 

# count them (the length of the list): 
numWords = len(words)

# how long the text component should display for: 
totalDuration = numWords * 0.3 # time in seconds 

fixationDuration = 1.5 # put in whatever your actual fixation duration is 
currentWordIndex = -1 # will be useful in "each frame" tab

# t is the time elapsed in the trial. 
# Calculate what word we should be up to by seeing how many 300 ms periods have elapsed so far (& force it to be an integer): 
checkIndex = int((t-fixationDuration)/0.3) 

# see if we need to switch to a new word (including the very first one): 
if checkIndex < numWords:
    if checkIndex != currentWordIndex: 
        currentWordIndex = checkIndex 
        text_1.setText(words[currentWordIndex]) # update to the current word

现在进行几次迭代,我有一个功能独立的脚本,可以分割一个句子,每次试验都会呈现1.5秒(90帧)的固定十字,然后在分句中显示每个单词300ms每个中间有300毫秒的空白。但是,我无法在我的大型脚本中使用此功能,该脚本需要200个句子作为输入。当我尝试将它包含在我的Builder的Builder部分中时(我想保持它与学生的兼容),它只会反复出现第一个句子(固定十字,单词,空白等到句末,然后固定再次和同一句话)。每个试验应如下所示:

  • 固定交叉1.5秒/ 90帧(60Hz)
  • 单词/空白/单词/句子的空白表达
  • 参与者必须回复的目标词

现在,目标词是Builder中的一个单独例程,但这似乎不是脚本不起作用的原因。它无法跟踪它应该呈现的句子,因为它现在没有内置(并且显然我取代了#34; John踢了句子#34;句子用我的句子变量,它是所有句子的列表),并且只是呈现相同的一个,因为它已经分裂的句子中有单词。这就是为什么我认为我需要checkIndex变量。我想我需要某种索引来检查每个帧已经呈现了多少帧,这样它就知道是否要将我的text_1刺激更新为下一个单词。

    from psychopy import visual
    from psychopy import core

    words = "He kicked the bucket".split() 
    win = visual.Window()
    text_1 = visual.TextStim(win)

    text_1.setText("+")
    for frameN in range (90):
       text_1.draw()
       win.flip()

    for word in words:

        text_1.setText(word)
        for frameN in range (18):
           text_1.draw()
           win.flip()

        text_1.setText(" ")
        for frameN in range(18):
           text_1.draw()
           win.flip()

3 个答案:

答案 0 :(得分:2)

请参阅下面的解决方案。

在这里要记住的一件重要事情是,您应该使用离散监视器框架/更新而不是连续时间来计时视觉刺激。例如,使用core.wait(0.300)通常会导致文本到达下一帧,导致某些测试的实际间隔为316.7 ms,而其他测试则为300 ms。 visual.Window.flip()函数会暂停所有内容,直到监视器更新为止,因此循环flip()会使循环与监视器同步 - 非常有用!

from psychopy import visual
words = 'John kicked the bucket'.split()
win = visual.Window()
text_1 = visual.TextStim(win)

for word in words:
    # Set text for this trial
    text_1.text = word

    # Show text for 300 ms = 18 frames on 60Hz monitor
    for frame in range(18):
        text_1.draw()
        win.flip()

    # Blank screen for 300 ms = 18 frames on 60Hz monitor
    for frame in range(18):
        win.flip()  # OBS: no drawing in this loop. Just a blank screen.

确实需要您的计算机实际与显示器同步。如果您运行不同于60 Hz的刷新率,请更改帧数,以便获得所需的300 ms。如果你使用心理,运行编码器 - &gt;演示 - &gt;时间 - &gt; timesByFrames,你应该在60Hz的监视器上看到16.667毫秒左右的窄分布。

答案 1 :(得分:0)

.reset_index(drop=True)

如果我理解你的问题,我想这应该做你想要的。当您要显示空白屏幕时,代替import time words = sentence.split() for word in words: #place something to undo changes in blank screen, you can use try except text_1.setText(word) time.sleep(.3) text_1.setText("") #make changes during blank screen, put images or something time.sleep(.3) ,放置您想要做的任何事情。

答案 2 :(得分:0)

(代表OP发布)

问题已经解决。此代码进入Builder的“开始例程”部分:

 # get the sentence for this trial and 
 # split it into a list of words: 
 words = Sentence.split() 

 text_2.setText("+") #draw a fixation cross at the beginning of each trial for 90 frames
for frameN in range (90):
    text_2.draw()
    win.flip()

for word in words:

    text_2.setText(word) #set current word in Builder placeholder text variable
    for frameN in range (18):
           text_2.draw() #present current word for 18 frames
           win.flip()

    for frameN in range(18): #present blank screen for 18 frames
           win.flip()