Pyglet报错TypeError: expected string or buffer,求解决方案
解决Pyglet 1.4.8在树莓派上多屏幕全屏时的TypeError问题
这个报错是Pyglet 1.4.8在X11环境(树莓派默认窗口系统)下的一个已知小bug——根源是set_vsync方法里的警告处理逻辑出错了:它直接把Exception对象传给了warnings.warn(),但这个函数要求接收字符串参数。下面给你几个可行的解决办法:
办法一:创建窗口时显式禁用VSYNC
最简单的快速解决方式,在初始化窗口时加上vsync=False,直接绕过触发错误的代码路径:
import pyglet display = pyglet.canvas.get_display() screens = display.get_screens() # 显式关闭vsync,避免触发错误的警告逻辑 window = pyglet.window.Window(fullscreen=True, screen=screens[1], vsync=False) pyglet.app.run()
对于大多数展示类场景(比如你的netcomShopTV),禁用VSYNC的影响几乎可以忽略,不会影响多屏幕全屏的核心功能。
办法二:修改Pyglet源码修复bug
如果你需要保留VSYNC功能,可以手动修复这个代码错误:
- 找到文件路径:
/usr/local/lib/python2.7/dist-packages/pyglet/gl/xlib.py - 定位到
set_vsync方法里的异常捕获部分:
except Exception as e: warnings.warn(e)
- 修改为将异常转为字符串后再传入:
except Exception as e: warnings.warn(str(e))
这样warnings.warn()就能正常接收参数,不会再抛出TypeError了。
办法三:升级Pyglet版本(长期推荐方案)
Python2.7已经停止官方支持,Pyglet的后续版本(1.5.x及以上)不仅修复了这个bug,还全面支持Python3,功能也更完善。如果你的项目可以迁移到Python3,建议执行以下命令升级:
pip install --upgrade pyglet
升级后再运行你的代码,这个问题会从根源上得到解决。
内容的提问来源于stack exchange,提问作者Milad
相关产品推荐
相关产品推荐

