Kivy 在运行时改变 Widget 的颜色

Kivy change color of Widget at runtime

我有以下小部件:

class WhiteKey(Widget):
    def __init__(self, **kwargs):
        super(WhiteKey, self).__init__(**kwargs)
        self.col = (1,1,1,1)
        with self.canvas:
            Color(*self.col)
            Rectangle(pos=kwargs.get("pos"),size=(23,150))

然后我将其中几个添加到列表中,然后在 canvas:

上绘制
class Piano(Widget):
    keys = list()
    for i in range(7):
            self.keys.append(WhiteKey())

    for key in self.keys:
            self.canvas.add(key.canvas)

现在我想更改特定键的颜色,但是当我执行 self.keys[i].col = (0.5,0.5,0.5,1) 之类的操作时,什么都没有改变。关于如何解决这个问题有什么想法吗?

完整代码(编辑:使代码更清晰并修复了一个错误):

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import (
    NumericProperty, ReferenceListProperty, ObjectProperty
)
from kivy.vector import Vector
from kivy.clock import Clock
from random import randint
from kivy.graphics import Rectangle, Color

from random import random

class WhiteKey(Widget):
    def __init__(self, **kwargs):
        super(WhiteKey, self).__init__(**kwargs)
        self.color = (1,1,1)
        with self.canvas:
            Color(*self.color)
            Rectangle(pos=kwargs.get("pos"),size=(23,150))

class Piano(Widget):
    keys = list()
    def setupPiano(self):
        for i in range(7):
            self.keys.append(WhiteKey(pos=(24*i,0)))

        for key in self.keys:
                self.canvas.add(key.canvas)


    def update(self, dt):
        self.keys[0].color = (random(), 1, 1)

        self.canvas.clear()
        print(self.keys[0].color)

        for key in self.keys:
                self.canvas.add(key.canvas)


class PianoApp(App):
    def build(self):
        game = Piano()
        game.setupPiano()
        Clock.schedule_interval(game.update, 1.0)
        return game


if __name__ == '__main__':
    PianoApp().run()

这是一个非常愚蠢的错误,我必须通过管道进行更新以确保密钥本身正在更新。

以下代码有效:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import (
    NumericProperty, ReferenceListProperty, ObjectProperty
)
from kivy.vector import Vector
from kivy.clock import Clock
from random import randint
from kivy.graphics import Rectangle, Color

from random import random

class WhiteKey(Widget):
    def __init__(self, **kwargs):
        super(WhiteKey, self).__init__(**kwargs)
        self.color = (1,1,1)
        self.pos = kwargs.get("pos")
        with self.canvas:
            Color(*self.color)
            Rectangle(pos=self.pos,size=(23,150))
    def update(self):
        with self.canvas:
            Color(*self.color)
            Rectangle(pos=self.pos,size=(23,150))

class Piano(Widget):
    keys = list()
    def setupPiano(self):
        for i in range(7):
            self.keys.append(WhiteKey(pos=(24*i,0)))

        for key in self.keys:
                self.canvas.add(key.canvas)


    def update(self, dt):
        self.keys[0].color = (random(), 1, 1)
        print(self.keys[0].color)

        for key in self.keys:
                key.update()


class PianoApp(App):
    def build(self):
        game = Piano()
        game.setupPiano()
        Clock.schedule_interval(game.update, 1.0)
        return game


if __name__ == '__main__':
    PianoApp().run()