Использование вложенных параметров Kivy в холсте виджета - PullRequest
0 голосов
/ 06 июня 2018

Я делаю макет Kivy с использованием языка Kivy, и я заметил, что не могу использовать вложенные параметры при определении холста виджета.Вот что я имею в виду:

Пример 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, но это не такпроизойдет до тех пор, пока объект не будет инициирован.Есть ли способ сделать то, что я пытаюсь сделать здесь?

NB Кажется, это только проблема с холстом виджета.Я могу сделать, например, это без проблем:

:

Label:

    text: "Here is a button"
    var1: 1,0,0,1
    var2: self.var1

    color: self.var2

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Спасибо за @ EL3PHANTEN за подсказку: следующее решение расширяет его подход, но не требует каких-либо изменений в Python или создания пользовательского класса:

Код Python: так же, как в вопросе

** Kivy Language **

<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, пока не получат значение.

0 голосов
/ 06 июня 2018

Это происходит по двум причинам.
Ссылка self, на которую вы ссылаетесь, относится к Color
Если вы присваиваете ярлыку идентификатор, то вы можете ссылаться на его свойства.
Нов вашем случае это все равно не будет работать, потому что var2 будет установлен на var1 только после инициации объекта, так что это все еще ObjectProperty(None).И это будет None до следующего кадра.

Вы можете заставить его работать, если вы определите var1 как ListProperty в вашем классе.

В п.

class MyLabel(Label):
    var2 = ListProperty([0,0,0,0])

Затем в кв.

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
...