在kivy语言中设置变量

1 投票
1 回答
1316 浏览
提问于 2025-04-18 06:11

我想把一个矩形的绿色设置成另一个矩形的红色,这个是在kivy这个框架里做的。

这是我尝试过的代码:

<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 个回答

2

这里有一种方法,可以通过创建和使用一个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尝试访问它时,它并不存在。这可能是个bug。

你可以通过在Road的正常定义中以常规方式声明这个属性来修复它:

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

你设置的默认值其实没关系,因为kv定义仍然会覆盖它,矩形会相应地更新。

目前你总是会得到几乎相同的颜色,因为kivy的rgba值在0到1的范围内,但这个问题很容易解决。

撰写回答