在Widget的画布中使用嵌套的Kivy参数

时间:2018-06-06 12:44:35

标签: python kivy kivy-language

我正在使用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

2 个答案:

答案 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,直到它们获得值。