在 Widget 的 canvas 中使用嵌套的 Kivy 参数
Using nested Kivy parameters within a Widget's canvas
我正在使用 Kivy 语言制作 Kivy 布局,我注意到在定义 Widget 的 canvas 时似乎无法使用嵌套参数。这就是我的意思:
示例 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
是 None 直到 var1
被赋值,但是直到对象被初始化之后才会发生这种情况。有没有办法做我想做的事情?
N.B. 这似乎只是 Widget 的 canvas 的问题。我可以做,例如这没有问题:
:
Label:
text: "Here is a button"
var1: 1,0,0,1
var2: self.var1
color: self.var2
发生这种情况有两个原因。
您所指的 self
指的是 Color
如果你给你的标签一个id,那么你可以参考它的属性。
但在你的情况下,这仍然行不通,因为 var2
只会在对象启动后设置为 var1
,所以它仍然是 ObjectProperty(None)
。它将 None
直到下一帧。
如果您在 class 中将 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
感谢@EL3PHANTEN 的提示:以下解决方案扩展了他的方法,但不需要对 Python 进行任何修改或创建自定义 class:
Python代码:同问题
** 基维语**
<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,直到它们获得一个值。
我正在使用 Kivy 语言制作 Kivy 布局,我注意到在定义 Widget 的 canvas 时似乎无法使用嵌套参数。这就是我的意思:
示例 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
是 None 直到 var1
被赋值,但是直到对象被初始化之后才会发生这种情况。有没有办法做我想做的事情?
N.B. 这似乎只是 Widget 的 canvas 的问题。我可以做,例如这没有问题:
:
Label:
text: "Here is a button"
var1: 1,0,0,1
var2: self.var1
color: self.var2
发生这种情况有两个原因。
您所指的 self
指的是 Color
如果你给你的标签一个id,那么你可以参考它的属性。
但在你的情况下,这仍然行不通,因为 var2
只会在对象启动后设置为 var1
,所以它仍然是 ObjectProperty(None)
。它将 None
直到下一帧。
如果您在 class 中将 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
感谢@EL3PHANTEN 的提示:以下解决方案扩展了他的方法,但不需要对 Python 进行任何修改或创建自定义 class:
Python代码:同问题
** 基维语**
<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,直到它们获得一个值。