有没有办法在 PsychoPy 中使用 visual.Rect 同时显示多个矩形?

问题描述

我正在尝试创建由屏幕中心的 100 条小线组成的刺激,方向是从高斯分布中采样的(请参见下面的图片链接):

Orientation stimuli

我已经设法实现了一些几乎符合要求的东西,但是这段代码只能单独工作:

from psychopy import visual,core,event
import numpy as np
from numpy.random import random

import random

Lines = visual.Rect(
win=win,name='Lines',width=(0.015,0.0025)[0],height=(0.015,0.0025)[1],linewidth=1,lineColor=[1,1,1],lineColorSpace='rgb',fillColor=[1,fillColorSpace='rgb',opacity=1,depth=-2.0,interpolate=True)

lines_hpos = np.random.uniform(-0.49,0.49,100)
mu = 315
sigma = 15

for i in range(100):

Lines.pos = [lines_hpos[i],np.random.uniform(-0.49,0.49)]
Lines.ori = random.gauss(mu,sigma) 

我已尝试操作此代码,以便将其集成到我在 PsychoPy 的实验构建器中设计的完整实验中。我在实验构建器的编码窗口中运行以下代码,分别调用“gdist”和“loc”作为矩形“方向”和“位置”的值:

import random
gdist =[]
loc = []
lines_hpos = np.random.uniform(-0.49,100)
mu = 90
sigma = 20

for i in range(100):
    
    rloc = [lines_hpos[i],0.49)]
    loc.append(rloc)
    
    gauss = random.gauss(mu,sigma)
    gdist.append(gauss)

当我尝试运行实验时,我收到错误返回且实验无法启动:

File "C:\Users\r02mj20\AppData\Local\PsychoPy3\lib\site-packages\psychopy\visual\image.py",line 238,in __del__ 
File "C:\Users\r02mj20\AppData\Local\PsychoPy3\lib\site-packages\pyglet\gl\lib.py",line 97,in errcheck
ImportError: sys.Meta_path is None,Python is likely shutting down

我假设这与 pyglet 不喜欢一次有 100 个矩形的想法有关(旁注:如果 range(1),脚本可以正常工作)。如果有人对我如何解决解决此问题有任何建议,我将永远感激不尽。

解决方法

我认为这个想法没有任何问题,除了您最好使用 visual.Line 而不是 Rect,并且没有描述您的度量单位;保留显存的关键是BufferImageStim,顺便说一句

from psychopy import visual,core,event,monitors
from psychopy.iohub.client import launchHubServer

import random
import numpy as np

MU = 315; SIGMA = 15
num_lines = 100

io = launchHubServer(iohub_config_name='iohub_config.yaml')
display = io.devices.display
mon = monitors.Monitor(name = display.getPsychopyMonitorName())

win = visual.Window([640,480],units='pix',viewScale = 1.0,monitor = mon,winType='pyglet',fullScr = False,waitBlanking = True,useFBO = True,useLights = False,allowStencil=False,allowGui = True,screen = display.getIndex(),colorSpace = 'rgb255',color = [128,128,128],name = 'my_win01')

rects = []
lines_hpos = np.random.uniform(-0.49,0.49,num_lines)
for i in range(num_lines):
    line_rect = visual.Rect(win=win,size=(0.001,1.0),units='norm',pos=(0,0),lineWidth=1,lineColor=[1,1,1],fillColor=[1,opacity=1,depth=-2.0,name='lines_rect',interpolate=True,autoLog=False,autoDraw=False)
    line_rect.pos = [lines_hpos[i],np.random.uniform(-0.49,0.49)]
    line_rect.ori = random.gauss(MU,SIGMA)
    rects.append(line_rect)

rect_buffer = visual.BufferImageStim(win,buffer='back',stim=rects,sqPower2=False,interpolate=False,name='rect-buffer',autoLog=True)
rect_buffer.draw()
win.flip()

event.waitKeys()

enter image description here