使用pyglet绘制三角形时出现'vertex_list'属性不存在错误
问题原因
你遇到的AttributeError是因为pyglet 2.0及以上版本移除了pyglet.graphics.vertex_list这个旧API——这个接口在1.x版本中存在,但新版本已废弃并替换为新的实现方式。
解决办法
办法一:降级到pyglet 1.x版本
如果想继续使用原有代码,直接安装旧版本即可:
pip install pyglet==1.5.27
安装完成后,你的原有代码就能正常运行。
办法二:适配pyglet 2.x新API
pyglet 2.x推荐使用pyglet.graphics.VertexList(注意大小写:旧API是小写开头,新API是大写开头),同时需要修正代码中的小问题:
- 移除手动调用
window.on_draw(),pyglet的事件循环会自动触发这个方法 - 颜色值
250超出了c3B(无符号字节,范围0-255)的上限,改成255 - 在
on_draw中添加清屏操作,避免画面残留
修改后的完整代码:
from pyglet.gl import * import pyglet class Triangle: def __init__(self) -> None: self.vertex_list = pyglet.graphics.VertexList( 3, ('v3f', [-0.5, -0.5, 0.0, 0.5, -0.5, 0.0, 0.0, 0.5, 0.0]), ('c3B', [100, 200, 220, 200, 110, 100, 100, 255, 100]) ) class MyWindow(pyglet.window.Window): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.set_minimum_size(400, 300) self.triangle = Triangle() glClearColor(0.1, 0.1, 0.1, 1.0) def on_draw(self): self.clear() self.triangle.vertex_list.draw(GL_TRIANGLES) def on_resize(self, width, height): glViewport(0, 0, width, height) if __name__ == "__main__": window = MyWindow(1280, 720, "Hello", resizable=True) pyglet.app.run()
内容的提问来源于stack exchange,提问作者Mohammad Ajam
相关产品推荐
相关产品推荐

