问题描述
我正在尝试创建由屏幕中心的 100 条小线组成的刺激,方向是从高斯分布中采样的(请参见下面的图片链接):
我已经设法实现了一些几乎符合要求的东西,但是这段代码只能单独工作:
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()