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

Pyglet自定义Player类报错:'OrderedDict'对象无'get_texture'属性

问题分析与解决方案

兄弟,你遇到的AttributeError完全是因为把Pyglet Sprite父类的构造函数参数搞混了,而且还有几个和Pygame API差异的小坑,我给你拆解一下:

错误核心原因

Pyglet的pyglet.sprite.Sprite.__init__第一个必填参数是图像对象,但你却把self.groups(一个OrderedDict)当成第一个参数传进去了。代码里这行:

pyglet.sprite.Sprite.__init__(self, self.groups)

会让Pyglet误以为你传的OrderedDict是图像,试图调用它的get_texture()方法,自然就报错了——字典哪来这个方法嘛!

另外还有三个小问题:

  1. 你在调用父类构造后才给self.image赋值,这根本没用,父类初始化的时候已经需要图像了
  2. Pyglet的Sprite没有rect属性,这是Pygame的专属属性,Pyglet直接用x和y控制位置
  3. 主类里调用player的参数顺序错了:你的player类__init__参数是(self, x, y, game),但你传的是player(self, 0, 0),把game参数放在了第一个位置

修正后的代码

修正Player类

import pyglet
from pyglet.graphics import OrderedGroup

class Player(pyglet.sprite.Sprite):
    def __init__(self, x, y, game):
        self.game = game
        # 先加载图像,父类初始化必须用到它
        self.image = pyglet.resource.image("white_square.png")
        # 正确调用父类构造:第一个参数是图像,然后是x、y,最后传渲染组
        super().__init__(
            self.image,
            x=x * game.tilesize,
            y=y * game.tilesize,
            groups=game.spritesPlayer
        )

# 主类示例
class Game:
    def __init__(self):
        self.tilesize = 32
        # Pyglet的渲染组要用专用的OrderedGroup,不是普通OrderedDict
        self.spritesPlayer = OrderedGroup(0)
        # 注意参数顺序:x, y, game实例
        self.player = Player(0, 0, self)

额外提醒

  • Pyglet的渲染组(Group)不是普通的OrderedDict,要用pyglet.graphics.OrderedGroup来实现分层渲染,这样才能正确管理Sprite的绘制顺序
  • 别把Pygame的API习惯直接套到Pyglet上,比如rect、构造函数参数顺序这些差异很大,建议多看看Pyglet官方的Sprite文档

内容的提问来源于stack exchange,提问作者Rebagliati Loris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:43:40