编程语言
首页 > 编程语言> > Python – Kivy:AttributeError:’super’对象在尝试获取self.ids时没有属性’__getattr__’

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

作者:互联网

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

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

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

这是我的代码:

from kivy.app import App
from kivy.config import Config
from kivy.lang import Builder
from kivy.graphics import Line
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.widget import Widget
from kivy.uix.image import Image
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.behaviors import ButtonBehavior

#Variables
cords = ()
bld = Builder.load_file('conf.kv')

class Manager(ScreenManager): pass
class Principal(Screen): pass

class ClickableImage(ButtonBehavior, Image):
    def on_press(self):
        self.source = 'button_press.png'

    def on_release(self):
        self.source = 'button.png'
        self.ids.uno.source = 'button_press.png'

class canva(Widget):
    def on_touch_down(self, touch):
        global cords
        with self.canvas:
            touch.ud['line'] = Line(points=(touch.x, touch.y), width=1.5)
        cords = (touch.x, touch.y)

    def on_touch_move(self,touch):
        global cords
         touch.ud['line'].points = cords + (touch.x, touch.y)

    def on_touch_up(self,touch):
        self.canvas.clear()

class Api(App):    
    def build(self):
        return bld

if __name__ == '__main__':
    Api().run()

这是我的.kv文件:

# conf to file:  test.py

<Manager>:
    Principal:

<Principal>:
    GridLayout:
        size_hint_x: 0.5
        size_hint_y: 0.6
        width: self.minimum_width
        cols: 3
        ClickableImage:
            id: 'uno'
            size: 10,10
            source: 'button.png'
            allow_strech: True
        ClickableImage:
            id: 'dos'
            size: 30,30
            source: 'button.png'
            allow_strech: True
    canva:

解决方法:

我们来看看输出:

'super' object has no attribute '__getattr__'

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

我会说它类似于canvas,它不是一个小部件,但它可能看起来像那样(这就是为什么我对你的代码感到困惑:P).你已经注意到了一些东西:< some object>就像Python的东西=< 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分配一个字符串,大致这就是你得到的.

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

标签:python,kivy,kivy-language
来源: https://codeday.me/bug/20190527/1165975.html