从先前图像集中绘制1个图像+从列表中绘制2个随机图像(Python / Psychopy)

时间:2016-01-18 15:07:02

标签: python psychopy

在下面的代码中,我从列表(目标集)中绘制3个图像,然后将它们显示在屏幕上。接下来,我将另外3个图像(图片)显示在屏幕的不同部分。对于第二部分;在50%的情况下,我希望“图片”图像与最初显示的图像(目标集)相同。我对这部分没问题,我在x == 0时设置pics = targetset(基本上是翻转硬币)。

我的问题是,在另外50%的情况下,我希望其中一个'pics'设置为与其中一个orignally show set(targetset)相同,三者中的任何一个。我希望从图片列表中随机选择剩下的2个。按照我的逻辑,按照我的逻辑,我只能将“图片”图像与“目标集”中最初显示的图像完全相同或全部不同。

添加问题:当x == 0(制作pics = targetset)时,它们都显示正常,但是当x == 1(意味着不做更改)时,我收到以下错误消息:

pics [i] .pos = location [i] UnboundLocalError:在赋值之前引用的局部变量'pics'

这是我的代码:

#create initial target set
imgList1 = glob.glob(os.path.join('stim','*.png'))
random.shuffle(imgList1)
targetset = [visual.ImageStim(window, img) for img in imgList1[:3]]

#initial target set location
setlocation = [(-2,0),(0,0),(2,0)]
random.shuffle(setlocation)

#create target list
imgList = glob.glob(os.path.join('stim', '*.png'))
random.shuffle(imgList)
pics = [visual.ImageStim(window, img) for img in imgList[:3]]

#set target locations
location = [(1,2),(3,3),(5,5)]
random.shuffle(location)

'''define sequential presentation function'''
def seq():
    x = random.randint(0,1)
    if x == 0:
        pics = targetset
    print x

    #display initial target set
    for i in range(3):
        targetset[i].pos = setlocation[i]
        targetset[i].draw()

    window.flip()
    core.wait(3)

    #display targets
    for i in range(3):
        pics[i].pos = location[i]
        pics[i].draw()
        window.flip()
        core.wait(1)

seq()
core.wait(3)
window.close()
quit()

我希望有人可以提供帮助, 干杯 小号

1 个答案:

答案 0 :(得分:1)

我看到你的代码可能存在一些陷阱。一个是您从同一组图像中创建两个单独的列表imgList1imgList,然后您将每个列表分别随机化,并将每个列表中的前三个元素拉入{{1}分别和targetset。这些子集可能在图像中具有一些重叠。从你对任务的描述来看,我并不认为这是故意的。我可能建议只创建1 pics,然后使用imgList函数从列表中提取图像。 Pop返回列表中的最后一个元素,然后从列表中删除该元素。我认为这就像从牌组中取出一张牌,你不能再画一张牌,因为它不再在牌组中了。你现在正在做的就像从两个不同的套牌中抽取卡片。你可能会两次获得同一张卡。

我在这里看到的第二个问题是你定义了当你的硬币翻转x为0时要做什么的条件,但是当你的硬币翻转为1时你没有定义一个条件。目前,它只会显示来自imgList.pop()的前3张图片,因为这是您定义imgList的方式。我可能会建议在x / coin块的if / else块中定义pics。如果它为0,则使用pics,如果它是1,则随机从目标列表中选择一个元素,然后将该元素复制到targetset并弹出另外两个图像pics。与所有编码一样,解决此问题的方法不止一种,但我会在这里提供解决方案。

imgList