我为一种android锁定的东西编写了一个代码,每当我尝试使用id获取特定的ClickableImage时,它会引发以下错误:
specs2
我花了好几个小时试图寻找这个问题的解决方案,我看着其他人有同样的问题,人们告诉他们要更改构建器的站点,因为需要首先调用它来获取ID属性或类似的东西,但每次我移动构建器时,它都会引发错误“class not defined”。有线索吗?
这是我的代码:
System.exit
这是我的.kv文件:
AttributeError: 'super' object has no attribute '__getattr__'
答案 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
分配一个字符串,大致就是你得到的。
(如果我错了,请纠正我)