PsychoPy入门_05_循环和随机

作者: ChZ_CC | 来源:发表于2016-10-14 17:45 被阅读1328次

    不靠谱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_循环和随机

        本文链接:https://www.haomeiwen.com/subject/mitnyttx.html