我正在使用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
<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()
我认为这里的问题是,在var1
被赋值之前,var2
是None,但这直到对象被初始化之后才会发生。有没有办法做我想做的事?
例如,我可以这样做,没有问题:
Label:
text: "Here is a button"
var1: 1,0,0,1
var2: self.var1
color: self.var2
发布于 2018-06-07 00:07:03
发生这种情况有两个原因。
您所指的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
发布于 2018-06-07 21:07:25
感谢@EL3PHANTEN的提示:以下解决方案扩展了他的方法,但不需要对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,直到它们获得一个值。
https://stackoverflow.com/questions/50720740
复制相似问题