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()
我有以下小部件:
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()