Python &引用;值太多,无法解包错误“;尝试在pyglet中创建批时

Python &引用;值太多,无法解包错误“;尝试在pyglet中创建批时,python,opengl,pyglet,Python,Opengl,Pyglet,我一直在尝试让批处理在pyglet中工作,但我完全被来自pyglet/graphics/\uuuuuu init\uuuuu.py文件的错误消息“太多值无法解包”弄糊涂了。我的猜测是,在将几何体添加到批处理时,我在语法方面做了一些错误的事情 我将代码缩减到产生错误的关键部分: from pyglet.gl import * from pyglet.graphics import * import pyglet batch = pyglet.graphics.Batch() img = pygl

我一直在尝试让批处理在pyglet中工作,但我完全被来自
pyglet/graphics/\uuuuuu init\uuuuu.py
文件的错误消息“太多值无法解包”弄糊涂了。我的猜测是,在将几何体添加到批处理时,我在语法方面做了一些错误的事情

我将代码缩减到产生错误的关键部分:

from pyglet.gl import *
from pyglet.graphics import *
import pyglet

batch = pyglet.graphics.Batch()
img = pyglet.image.load('pic.png')
texture = img.get_texture()

class TextureEnableGroup(pyglet.graphics.Group):
    def set_state(self):
        glEnable(GL_TEXTURE_2D)
    def unset_state(self):
        glDisable(GL_TEXTURE_2D)

texture_enable_group = TextureEnableGroup()

class TextureBindGroup(pyglet.graphics.Group):
    def __init__(self, texture):
        super(TextureBindGroup, self).__init__(parent=texture_enable_group)
        self.texture = texture
    def set_state(self):
        glBindTexture(GL_TEXTURE_2D, self.texture.id)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    def __eq__(self, other):
        return (self.__class__ is other.__class__ and self.texture == other.__class__)

batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), (('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205))))
“太多的值无法解包”是在执行以下操作时出现的错误

a, b = "a b c".split(" ")
拆分返回三个值,但您尝试将它们固定为两个。
我猜你在最后一行的某个地方错了括号。尝试使用更清晰的语法。就目前而言,它非常可怕且不可读。

我猜您对批处理.add()的第4个参数不符合pyglet所期望的格式。检查这一点可能有用

此外,查看pyglet中发生错误的行可以提供更多信息。问题可能是传递给pyglet函数的参数有问题


PS:for
add
可能很有趣。

您的问题在这一行:

batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), (('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205))))
我认为应该是:

batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), ('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205)))
请注意,我是如何将最后一个参数的格式从
((tuple),(tuple))
更改为
(tuple),(tuple))
。我不熟悉pyglet,但发现这是从中调用
batch.add()
的正确方法。请注意,
*data
表示函数调用末尾的参数变量列表,而不是您尝试的元组或列表

试试看,让我们知道它对你有什么好处。

多亏了马可, 脚本的正确最后一行是:

batch.add(6, GL_TRIANGLES, TextureBindGroup(texture), ('v3i', (64, 64, 0, -64, -64, 205, -64, 64, 205, 64, -64, 205, 64, 64, 0, -64, -64, 205)), ('t2i', (0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1)))
i、 e.问题已解决=)


部分问题在于我将所有数据作为一个元组发送(marcog指出),并传递了一个错误的Geometry数据批长度值;6个顶点,而不是12个。

我使用google解决了这个问题,但问题是错误发生在pyglet python文件中的某个地方。因此,我认为我没有以这样或那样的方式正确使用batch.add()函数。问题是;我应该如何使用它?你需要阅读pyglet文档。你确定你想喂什么就喂什么吗?语法不可读。使用一些变量怎么样?是的。这解决了部分问题:)唯一的问题是我有一个包含点和纹理坐标的数组。你知道我如何将这些信息传递到这个函数中吗?python是否提供了某种方式让它将您传入的数组作为参数输入?@Bartvbl By array您是指numpy数组还是python列表?python列表。(对不起,我还不完全习惯python术语)@Bartvbl那么我不确定,对不起!有没有办法用numpy来做呢?