Установка переменных на кивийском языке

Я пытаюсь установить зеленый цвет прямоугольника, равный красному цвету прямоугольника в киве.

Вот что я попробовал:

<Road>:
    id:label
    canvas:
        Color:
            r: random.randint(11,14)*0.04
            g: r
            b:random.randint(14,15)*0.04
            a:1

        Rectangle:
            pos: self.pos
            size: self.size

После этого я получаю ошибку:

 NameError: name 'r' is not defined

Я попытался использовать kivy.properties, но они, кажется, остаются только постоянными, и мне приходится вызывать этот виджет несколько раз (каждый с разным цветом).

1 ответ

Решение

Вот способ сделать это, создав и используя свойство Road,

<Road>:
    id:label
    random_colours: [random.randint(11,14)*0.04, random.randint(14,15)*0.4]
    canvas:
        Color:
            r: root.random_colours[0]
            g: root.random_colours[0]
            b: root.random_colours[1]
            a: 1

        Rectangle:
            pos: self.pos
            size: self.size

Вы, вероятно, найдете что-то подобное наиболее удобным при работе с такими вершинными инструкциями, так как в kv вы не можете легко ссылаться на их другие атрибуты, но вы можете легко работать со свойствами виджета.

Изменить: как вы комментируете, это не совсем работает. Кажется, проблема в том, что создание динамического свойства происходит слишком поздно, поэтому его не существует, когда Color пытается получить к нему доступ. Это может быть ошибкой.

Вы можете исправить это, объявив свойство обычным способом с обычным определением вашей Дороги:

class Road(Widget):
    random_colours = ListProperty([0.1, 0.1])

Неважно, что вы устанавливаете в качестве значения по умолчанию, так как определение kv все равно переопределяет его, и прямоугольник обновится соответствующим образом.

В настоящее время вы всегда получите один и тот же цвет (почти), потому что rgba kivy принимает значения в диапазоне 0-1, но это легко исправить.

Другие вопросы по тегам