在 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,直到它们获得一个值。