Python - Kivy:AttributeError:'super'对象在尝试获取self.ids时没有属性'__getattr__'

时间:2016-08-22 08:23:49

标签: python kivy kivy-language

我为一种android锁定的东西编写了一个代码,每当我尝试使用id获取特定的ClickableImage时,它会引发以下错误:

specs2

我花了好几个小时试图寻找这个问题的解决方案,我看着其他人有同样的问题,人们告诉他们要更改构建器的站点,因为需要首先调用它来获取ID属性或类似的东西,但每次我移动构建器时,它都会引发错误“class not defined”。有线索吗?

这是我的代码:

System.exit

这是我的.kv文件:

AttributeError: 'super' object has no attribute '__getattr__'

1 个答案:

答案 0 :(得分:6)

让我们看一下输出:

'super' object has no attribute '__getattr__'

在kv语言中id以特殊方式设置(现在最多为1.9.2),其值不是字符串,因为它不是随意变量。您无法使用<widget>.id访问它。

我会说它类似于canvas,它不是一个小部件,但它可能看起来像那样(这就是为什么我对你的代码感到困惑:P)。您已经注意到something: <some object>就像Python的something = <object>那样(至少我认为)是id的值不是字符串的整点(有些是奇数) )。如果id是一个字符串,则可能需要检查以便从随意分配值中以某种方式将其排除。也许是因为性能或简单。

因此,假设id是未来关键字的关键字。实际上,它是,因为分配给id的字符将成为一个字符串键,其值为WeakProxy的对象,以及WeakProxy指向的对象。或者更好地说:

id: value

变为

<some_root_widget>.ids[str(value)] = weakref.proxy(value)

其中value成为对象print(self)将返回的内容)

我怀疑(不确定)如果你使用字符串作为id的值,你最终会指向一个字符串weakref / WeakProxy。我使用单词point,因为它提醒我指针,不要与C指针混淆。

现在,如果再看一下输出:

  • super可让您访问自己继承的课程

  • print('string id'.__getattr__)会给您同样的错误,但'super'会被实际值替换,因为......它没有__getattr__

因此如果你将字符串值分配给id,你就会遇到这种情况:

<some_root_widget>.ids[str('value')] = weakref.proxy('value')  # + little bit of magic

虽然str('value')不一定是错误的,但默认情况下您无法为字符串创建weakref.proxy。我不确定Kivy如何使用WeakProxies处理这个问题,但是如果你给id分配一个字符串,大致就是你得到的。

(如果我错了,请纠正我)