AttributeError:'MyGrid'对象没有我的函数的属性

时间:2019-06-11 02:57:06

标签: python python-3.x kivy attributeerror

目标
我正在尝试创建一个简单的脚本,以演示如何将功能附加到可以查看(并很快更改)另一个小部件属性的按钮。 我知道根据示例脚本effectwidget.py这是可能的。


我的方法
目前,我正在尝试反向处理effectwidget.py,因为它做了很多我可能想用kivy做的事情。

在effectwidget.py中,SpinnerRow类具有一个名为update_effectwidget()的函数,该函数可以查看/编辑ComparisonWidget的特定实例的属性(甚至不是SpinnerRow的子实例)在小部件树中)。 SpinnerRow具有触发EffectSpinner的子窗口小部件update_effectwidget()

在我的脚本中,ButtonHolder扮演SpinnerRow的角色,colorChange1()扮演update_effect()的角色。

我的代码
该代码已减少为仅显示可再现的错误。因此,我不打算使用 this 更改标签的颜色。

#!/usr/bin/env python3
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.uix.label import Label
from kivy.lang import Builder

class ButtonHolder(BoxLayout):
    def colorChange1(self, *args):
        print("this function works")

Builder.load_string("""
<MyGrid>:
  rows: 3
  Label:
    canvas.before:
      Color:
        rgba: 1,0,0,1
      Rectangle:
        pos: self.pos
        size: self.size
    id: toplabel
  Label:
    canvas.before:
      Color:
        rgba:  0,1,0,1
      Rectangle:
        pos: self.pos
        size: self.size
    id: bottomlabel
  ButtonHolder:
    Button:
      effectwidget: toplabel
      on_press: root.colorChange1()
""")

class MyGrid(GridLayout):
    pass

class TheApp(App):
    def build(self):
        return MyGrid()

TheApp().run()

问题
我收到以下错误:
AttributeError: 'MyGrid' object has no attribute 'colorChange1'

我对您的问题

colorChange1()内的函数ButtonHoldereffectwidget.py相同时,为什么找不到函数sitemap.xml

出于范围和管理的目的,给我每个类一个自己的函数,以便可以通过self.functionName()来调用它们是不切实际的。而且,如果root.functionName()仅在最根本的窗口小部件中调用函数(而不是沿途的任何父窗口小部件),这是否意味着大型kivy程序的根窗口小部件必须包含数十个函数?

注意: 我可以找到的最接近的问题是Kivy 'object has no attribute' Error  和AttributeError: 'Button' object has no attribute 'update_label'.
,但他们的案件过于复杂和具体,无法找到我的一般问题的答案。但是我看过他们。

1 个答案:

答案 0 :(得分:1)

您最主要的是对根概念的无知。为了更好地观察它,我缩进了您的代码:

<MyGrid>:
    rows: 3
    Label:
        id: toplabel
        canvas.before:
            Color:
                rgba: 1,0,0,1
            Rectangle:
                pos: self.pos
                size: self.size
    Label:
        id: bottomlabel
        canvas.before:
            Color:
                rgba:  0,1,0,1
            Rectangle:
                pos: self.pos
                size: self.size
    ButtonHolder:
        Button:
            effectwidget: toplabel
            on_press: root.colorChange1()

根是结构的初始元素,在本例中为MyGrid。

MyGrid是否具有colorChange1方法?不,这就是为什么会出现该错误。

colorChange1方法属于哪个类?属于ButtonHolder类,然后必须通过对象的引用通过id来更改根。

<MyGrid>:
    rows: 3
    Label:
        id: toplabel
        canvas.before:
            Color:
                rgba: 1,0,0,1
            Rectangle:
                pos: self.pos
                size: self.size
    Label:
        id: bottomlabel
        canvas.before:
            Color:
                rgba:  0,1,0,1
            Rectangle:
                pos: self.pos
                size: self.size
    ButtonHolder:
        id: button_holder # <---
        Button:
            effectwidget: toplabel
            on_press: button_holder.colorChange1() # <---