PsychoPy入门_05_循环和随机

不靠谱PsychoPy入门教程目录:

  1. PsychoPy入门00安装

  2. PsychoPy入门01文字和图片的呈现

  3. PsychoPy入门02按键等待&反应时

  4. PsychoPy入门03视频和音频的呈现

  5. PsychoPy入门04等级评定

  6. PsychoPy入门05循环和随机

  7. PsychoPy入门06数据记录

  8. PsychoPy入门07鼠标的使用

  9. 用PsychoPy做视觉搜索任务实验


做实验的时候一种条件下一般会多个trials,我们不可能把每一个刺激的呈现过程都写一遍,会烦死的。过程一样,内容不同,用循环就变得非常简单了。

比如上次我们对一张图片做等级评定,评定它好不好看,喜欢程度如何。现在我有一组图片,都要做评定,怎么让它循环呢?

把前次的程序复制过来,作为这次的起始代码:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

#示例4
'''
    等级评定
'''
#载入所需要的库
from psychopy import visual, core, event

#创建窗口
win = visual.Window(fullscr = False, size = (1000,600),
                    color = (-1.0,-1.0,-1.0), units = 'norm', monitor = 'testMonitor')

#评定内容
pic = visual.ImageStim(win, image = 'test_1.jpg', pos = (0.0,0.4))
item = visual.TextStim(win, text = u'', pos = (0.0,-0.1))

#量表
scale_1 = visual.RatingScale(win, choices = [u'ugly',u'WTH',u'nice'], pos = (0.0,-0.6))
scale_2 = visual.RatingScale(win, scale = u'1=非常不喜欢 . . . . . . . . . . . 7=非常喜欢',
                                low =1, high = 7, precision = 1, pos = (0.0,-0.6),
                                marker = 'circle', showValue = True,
                                acceptPreText = u'请在横线上点击')
#呈现
item.text = u'这张图给你的感受是?'
scale_1.reset()
while scale_1.noResponse:
    pic.draw()
    item.draw()
    scale_1.draw()
    win.flip()
print 'scale 1:', scale_1.getRating(), scale_1.getRT()

item.text = u'评定你对着张图片的喜爱程度。'
scale_2.reset()
while scale_2.noResponse:
    pic.draw()
    item.draw()
    scale_2.draw()
    win.flip()
print 'scale 2:', scale_2.getRating(), scale_2.getRT()

win.close()
core.quit()

循环

我找了10张罗夏墨迹图片,把他们的名字放在一个list里:

pics = ['test_1.jpg','test_2.jpg','test_3.jpg','test_4.jpg','test_5.jpg','test_6.jpg','test_7.jpg','test_8.jpg','test_9.jpg','test_10.jpg']

你自己随便找几张图片,把尺寸裁成一样的,名字改好。

对不同图片做等级评定的时候差别只在于pic这个图片刺激的image不同,所以我们只需要在每次循环的时候把pic.image重新赋值就好了。下面写一下循环的语句:

for i in range(len(pics)):
    pic.image = pics[i]
    # 呈现
    # ...

len(list)得到的是这个list的长度,pics里面有10个东西,len(pics)等于10。range(10)得到的是一个从0到10(不包含)10的列表。这样就是循环10次,第一次pic.image等于pics里的第一个项目,第二次是第二个,依次往后,直到最后一个。

下面呈现的部分直接用前面的代码,统一缩进到for循环里就行。

运行一下,这样就是对10张图片进行评定了对吧。(P.S.如果你没耐心一个个点下去,返回主界面,点红色的叉叉退出去就行。)

这里名字有规律的话,其实可以更加简化。不需要pics这个list,直接修改pic.image那里。比如:

pic.image = 'test_'+str(i)+'.jpg'

我就还是用上面的pics啦。

随机

实验设计里面随机是个常用的手段。为了消除首因效应、近因效应之类的。

在python程序里要使用随机函数需要先载入random库。

import random

要随机图片的顺序很简单,把list里图片的顺序打乱一下就好了。

random.shuffle(pics)

OK,这样评定图片的顺序就随机了。轻松加愉快~!


本次的完整代码如下:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

#示例5
'''
    循环。随机
'''

#载入所需要的库
from psychopy import visual, core, event
import random

#创建窗口
win = visual.Window(fullscr = False, size = (1000,600),
                    color = (-1.0,-1.0,-1.0), units = 'norm', monitor = 'testMonitor')

#文字
text_1 = visual.TextStim(win, text = u'示例5', height = 0.12, pos = (0.0,0.2), color = 'pink')
text_2 = visual.TextStim(win, text = u'', height = 0.1, pos = (0.0,-0.2), color = 'skyblue')
text_2.text= u'循环'

#呈现文字刺激
text_1.draw()
text_2.draw()
win.flip()
core.wait(2)

#评定内容
pic = visual.ImageStim(win, image = 'test_1.jpg', pos = (0.0,0.4))
item = visual.TextStim(win, text = u'', pos = (0.0,-0.1))
item.text = u'这张图给你的感受是?'

#量表
scale_1 = visual.RatingScale(win, choices = [u'ugly',u'WTH',u'nice'], pos = (0.0,-0.6))
scale_2 = visual.RatingScale(win, scale = u'1=非常不喜欢 . . . . . . . . . . . 7=非常喜欢',
                                low =1, high = 7, precision = 1, pos = (0.0,-0.6),
                                marker = 'circle', showValue = True,
                                acceptPreText = u'请在横线上点击')
pics = ['test_1.jpg','test_2.jpg','test_3.jpg','test_4.jpg','test_5.jpg','test_6.jpg','test_7.jpg','test_8.jpg','test_9.jpg','test_10.jpg']
random.shuffle(pics)

#呈现
for i in range(len(pics)):
    pic.image = pics[i]
    scale_1.reset()
    item.text = u'这张图给你的感受是?'
    while scale_1.noResponse:
        pic.draw()
        item.draw()
        scale_1.draw()
        win.flip()
    print 'scale_1:',scale_1.getRating(),scale_1.getRT()
    item.text = u'评定你对着张图片的喜爱程度。'
    scale_2.reset()
    while scale_2.noResponse:
        pic.draw()
        item.draw()
        scale_2.draw()
        win.flip()
    print 'scale_2:',scale_2.getRating(),scale_2.getRT()

P.S. 在真正设计实验程序的时候,你会发现前面这些呈现刺激这一大堆是最简单的。都是固定的。复杂的地方在你实验材料的分配,实验流程的控制等等。

就酱。有什么疑问或建议请在下方评论。

你可能感兴趣的:(PsychoPy入门_05_循环和随机)