I’m creating an experiment that requires participants to change the layout (including line spacing, word spacing, and font size) of a Chinese article using sliders.
I have not yet found functions for directly changing the word spacing, so I simply use TextStim and for loops to present and change the position of each Chinese character individually. It works OK when I have around 10 characters, but when I have more characters (let’s say a hundred), the program becomes super slow and the responses of sliders severely lag.
It could be the for loop that slows down everything, but since I’m kinda new to Psychopy/Python, I have not yet figured out how to have it done more elegantly. I’m now checking the ElementArray.py which allows user to present multiple objects at the same time. Yet I don’t know if it can be used for presenting words or characters.
May I know if any of you got advices for speeding up the program so that the stimuli are presented smoothly? Thank you very much in advance.
I’m using version 3.6.8 on Mac.
Here is my code:
# Initialize components for Routine "Trials" sentence='最基本的眼動研究是觀察' def split(assay): return [char for char in assay] wordstr=split(sentence) wordlist=[None]*len(wordstr) for index in range(len(wordstr)): wordlist[index] = visual.TextStim(win=win, text=wordstr[index], font='Songti SC', units='pix', pos=((-250+50*index), 0), height=50.0, wrapWidth=None, ori=0.0, color='black', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-1.0); # *wordlist* updates for j in range(len(wordlist)): if wordlist[j].status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance: # keep track of start time/frame for later wordlist[j].frameNStart = frameN # exact frame index wordlist[j].tStart = t # local t and not account for scr refresh wordlist[j].tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(wordlist[j], 'tStartRefresh') # time at next scr refresh wordlist[j].setAutoDraw(True) if wordlist[j].status == STARTED: # only update if drawing if sli_WS.value is None: # sli_WS is the slider control word spacing condsWS=0 else: condsWS=sli_WS.value if sli_LD.value is None: # sli_LD is the slider control line spacing condsLD=100 else: condsLD=sli_LD.value if sli_FS.value is None: # sli_FS is the slider control font size condsFS=26 else: condsFS=sli_FS.value lineCountH=(j+2)%5 # telling the position of the character within a line lineCountV=(j+2)//5 # telling the position of the line within an article PosX=-516+condsFS/2+lineCountH*condsFS+condsWS*condsFS*lineCountH PosY=276-(condsFS/2)-(lineCountV*condsFS*((100+condsLD)/100)) wordlist[j].setPos((PosX, PosY)) wordlist[j].setHeight(sli_FS.value or 26)