Установка переменных на кивийском языке
Я пытаюсь установить зеленый цвет прямоугольника, равный красному цвету прямоугольника в киве.
Вот что я попробовал:
<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, но это легко исправить.