首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我在.kv文件中得到`‘’无类型‘’对象没有属性`?

为什么我在.kv文件中得到`‘’无类型‘’对象没有属性`?
EN

Stack Overflow用户
提问于 2016-04-28 10:15:33
回答 1查看 463关注 0票数 2

我的简化.kv文件:

代码语言:javascript
运行
复制
<GameWorld>:
    player: the_player

    canvas:
        Rectangle:
            pos: 5, root.top - 25
            size: self.player.health, 20  # error raised in this line

    Player:
        id: the_player
        center: self.center

我的简化Python文件:

代码语言:javascript
运行
复制
class Player(Widget):
    health = NumericProperty(50)

    def __init__(self, **kwargs):
        super(Player, self).__init__(**kwargs)
        self.health = 100

class GameWorld(Widget):
    player = ObjectProperty()
    entities = ListProperty()

    def __init__(self, **kwargs):
        super(GameWorld, self).__init__(**kwargs)
        self.entities.append(self.player)

我得到的错误是:

代码语言:javascript
运行
复制
AttributeError: 'NoneType' object has no attribute 'health'

基维认为self.playerNone。请帮我弄明白出了什么问题。

EN

回答 1

Stack Overflow用户

发布于 2016-04-28 11:17:46

在评估canvas指令时,GameWorld.player仍然是None,这是ObjectProperty的默认值,因此出现错误。

如果您将None测试添加到kv规则中,如下所示:

代码语言:javascript
运行
复制
<GameWorld>:
    player: the_player
    canvas:
        Rectangle:
            pos: 5, root.top - 25
            size: self.player is not None and self.player.health, 20

不会抛出错误,但不会执行自动绑定。但是,如果将rebind=True添加到ObjectProperty的声明中

代码语言:javascript
运行
复制
class GameWorld(Widget):
    player = ObjectProperty(rebind=True)

这将正常工作。

留下不太优雅的替代解决方案:

您可以在定义时实例化一个Player对象:

代码语言:javascript
运行
复制
class GameWorld(Widget):
    player = ObjectProperty(Player())

或者,您可以将另一个NumericProperty添加到GameWorld,唯一的目的是绑定到player.health,但初始化为合理的值:

代码语言:javascript
运行
复制
class GameWorld(Widget):
    _player_health = NumericProperty(1)

代码语言:javascript
运行
复制
<GameWorld>:
    player: the_player
    _player_health: the_player.health

    canvas:
        Rectangle:
            pos: 5, root.top - 25
            size: self._player_health, 20
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36904093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档