我正在使用Kivy语言进行Kivy布局,我注意到在定义Widget的画布时似乎无法使用嵌套参数。这就是我的意思:
示例1 - 运行正常
<MainWidget>:
Label:
text: "Here is a button"
var1: 1,0,0,1
canvas.before:
Color:
rgba: self.var1
Rectangle:
pos: self.pos
size: self.size
示例2 - 这与TypeError: 'NoneType' object is not iterable
<MainWidget>:
Label:
text: "Here is a button"
var1: 1,0,0,1
var2: self.var1
canvas.before:
Color:
rgba: self.var2
Rectangle:
pos: self.pos
size: self.size
两者的Python代码
from kivy.app import App
from kivy.uix.widget import Widget
class MainApp(App):
def build(self):
return MainWidget()
class MainWidget(Widget):
pass
MainApp().run()
我认为这里的问题是var2
在分配var1
之前是None,但直到对象启动后才会发生这种情况。有没有办法做我想在这里做的事情?
N.B。这似乎只是Widget画布的一个问题。我可以做,例如这没问题:
Label:
text: "Here is a button"
var1: 1,0,0,1
var2: self.var1
color: self.var2
答案 0 :(得分:1)
出现这种情况有两个原因
您所指的self
指的是Color
如果您为标签指定了ID,则可以参考其属性
但在您的情况下,这仍然无效,因为var2
只会在启动对象后设置为var1
,因此它仍为ObjectProperty(None)
。它将None
直到下一帧。
如果您在班级中将var1
定义为ListProperty
,则可以使其有效。
在py。
class MyLabel(Label):
var2 = ListProperty([0,0,0,0])
然后在kv。
MyLabel:
id: label
text: "Here is a button"
var1: 1,0,0,1
var2: self.var1
canvas.before:
Color:
rgba: label.var2
Rectangle:
pos: label.pos
size: label.size
答案 1 :(得分:1)
感谢@ EL3PHANTEN的提示:以下解决方案扩展了他的方法,但不需要对Python进行任何修改或创建自定义类:
Python代码:与问题中的相同
** Kivy语言**
<MainWidget>:
Label:
text: "Here is a button"
var1: 1,1,0,1
var2: self.var1
canvas.before:
Color:
rgba: self.var2 if self.var2 is not None else [0,0,0,0]
Rectangle:
pos: self.pos
size: self.size
这是有效的,因为Kivy语言定义的所有参数似乎都设置为None,直到它们获得值。