目标
我正在尝试创建一个简单的脚本,以演示如何将功能附加到可以查看(并很快更改)另一个小部件属性的按钮。
我知道根据示例脚本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()
内的函数ButtonHolder
与effectwidget.py相同时,为什么找不到函数sitemap.xml
?
出于范围和管理的目的,给我每个类一个自己的函数,以便可以通过self.functionName()来调用它们是不切实际的。而且,如果root.functionName()仅在最根本的窗口小部件中调用函数(而不是沿途的任何父窗口小部件),这是否意味着大型kivy程序的根窗口小部件必须包含数十个函数?
注意:
我可以找到的最接近的问题是Kivy 'object has no attribute' Error
和AttributeError: 'Button' object has no attribute 'update_label'.
,但他们的案件过于复杂和具体,无法找到我的一般问题的答案。但是我看过他们。
答案 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() # <---