You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PsychoPy脚本运行触发GLException错误求助(附复现代码)

解决PsychoPy中pyglet.gl.lib.GLException: b'invalid value'错误

问题描述

在Windows 10/11系统上使用独立版PsychoPy-2023.2.3的Coder运行实验脚本时,反复触发pyglet.gl.lib.GLException: b'invalid value'错误。脚本用于测试被试回忆不同音节数无意义单词的暴露时长,两台不同电脑均复现该问题。

复现代码

from psychopy import visual, core, event, data, gui
import pandas as pd

# Use a dialog box to get participant number
dlg = gui.Dlg(title="Participant Information")
dlg.addField("Participant Number:")
dlg.show()

if dlg.OK:
    participant_number = dlg.data[0]
else:
    print("User canceled, exiting...")
    core.quit()

# Load stimuli from stimuli.xlsx
stimuli_df = pd.read_excel("stimuli.xlsx")

# Define experiment phases and display durations
phases = [500, 750, 1000, 1250]

# Initialize PsychoPy window
win = visual.Window(size=(800, 600), fullscr=False, color="white")

# Initialize text stimulus
text_stim = visual.TextStim(win, text="", height=30)

# Initialize data storage
output_data = []

# Loop through each phase
for phase_num, duration in enumerate(phases, start=1):
    for word in stimuli_df["Word"]:
        # Display stimuli word
        text_stim.text = word
        text_stim.draw()
        win.flip()

        # Record onset time using core.Clock
        trial_clock = core.Clock()
        trial_clock.reset()

        core.wait(duration / 1000)  # Convert duration to seconds

        # Display prompt and collect participant response
        text_stim.text = "Please type the word you just saw. When you have finished, press ENTER."
        text_stim.draw()
        win.flip()

        # Record response time
        response_clock = core.Clock()
        response_clock.reset()

        response = event.getText()
        response_time = response_clock.getTime()

        # Append data to output
        output_data.append({"Phase": phase_num, "Word": word, "Response": response, "ResponseTime": response_time})

# Save data to output text file
output_df = pd.DataFrame(output_data)
output_df.to_csv(f"participant_{participant_number}_output.csv", index=False)

# Close PsychoPy window
win.close()

完整报错信息

Traceback (most recent call last):
Hello from the pygame community. https://www.pygame.org/contribute.html
10.4986     WARNING     Monitor specification not found. Creating a temporary one...
  File "C:\Users\LENOVO\Desktop\EpochExp\responseEpoch_1.1_RT_GUI.py", line 45, in <module>
    text_stim.text = word
  File "C:\Program Files\PsychoPy\lib\site-packages\psychopy\tools\attributetools.py", line 27, in __set__
    newValue = self.func(obj, value)
  File "C:\Program Files\PsychoPy\lib\site-packages\psychopy\visual\text.py", line 381, in text
    self._setTextShaders(text)
  File "C:\Program Files\PsychoPy\lib\site-packages\psychopy\visual\text.py", line 399, in _setTextShaders
    self._pygletTextObj = pyglet.text.Label(
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\text\__init__.py", line 456, in __init__
    self.document.set_style(0, len(self.document.text), {
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\text\document.py", line 603, in set_style
    return super(UnformattedDocument, self).set_style(
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\text\document.py", line 512, in set_style
    self.dispatch_event('on_style_text', start, end, attributes)
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\event.py", line 418, in dispatch_event
    if handler(*args):
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\text\layout.py", line 1073, in on_style_text
    self._init_document()
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\text\layout.py", line 1043, in _init_document
    self._update()
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\text\layout.py", line 966, in _update
    lines = self._get_lines()
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\text\layout.py", line 942, in _get_lines
    glyphs = self._get_glyphs()
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\text\layout.py", line 1085, in _get_glyphs
    glyphs.extend(font.get_glyphs(text[start:end]))
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\font\base.py", line 394, in get_glyphs
    self.glyphs[c] = glyph_renderer.render(c)
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\font\win32.py", line 471, in render
    glyph = self.font.create_glyph(image)
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\font\base.py", line 364, in create_glyph
    glyph = texture.fit(image)
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\font\base.py", line 254, in fit
    region.blit_into(image, 0, 0, 0)
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\image\__init__.py", line 1736, in blit_into
    self.owner.blit_into(source, x + self.x, y + self.y, z + self.z)
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\image\__init__.py", line 1629, in blit_into
    source.blit_to_texture(self.target, self.level, x, y, z)
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\image\__init__.py", line 1000, in blit_to_texture
    glTexSubImage2D(target, level,
  File "C:\Program Files\PsychoPy\lib\site-packages\pyglet\gl\lib.py", line 106, in errcheck
    raise GLException(msg)
pyglet.gl.lib.GLException: b'invalid value'
################ Experiment ended with exit code 1 [pid:18900] #################

已排查项

  • 系统内存充足
  • 显卡驱动已更新至最新
  • 实验所用字体已正确安装

解决方案建议

  • 指定明确字体:初始化TextStim时指定系统确认真实存在的字体,例如visual.TextStim(win, text="", height=30, font="Arial"),避免自动选字体时的兼容问题。
  • 重构TextStim实例:每次显示不同文本时,重新创建TextStim对象,而非修改已有实例的text属性。示例:
    # 替换循环内的text_stim.text赋值为:
    text_stim = visual.TextStim(win, text=word, height=30, font="Arial")
    
  • 切换渲染后端:初始化Window时指定使用pygame后端,例如visual.Window(size=(800, 600), fullscr=False, color="white", winType='pygame')。
  • 检查刺激文本:确认stimuli.xlsx中的单词无特殊字符、空值或不可渲染字符(如控制字符)。
  • 更换PsychoPy版本:尝试切换到2023.1.x或2024.x版本,避开当前版本的pyglet兼容bug。

内容的提问来源于stack exchange,提问作者Sayantan Mandal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:44:56