不靠谱PsychoPy入门教程目录:
PsychoPy入门00安装
PsychoPy入门01文字和图片的呈现
PsychoPy入门02按键等待&反应时
PsychoPy入门03视频和音频的呈现
PsychoPy入门04等级评定
PsychoPy入门05循环和随机
PsychoPy入门06数据记录
PsychoPy入门07鼠标的使用
用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. 在真正设计实验程序的时候,你会发现前面这些呈现刺激这一大堆是最简单的。都是固定的。复杂的地方在你实验材料的分配,实验流程的控制等等。
就酱。有什么疑问或建议请在下方评论。