Вы должны сохранить и повторно использовать инструкцию Color и изменить цвет, поскольку Canvas добавляет инструкции, в вашем случае вы добавляете новую инструкцию Color, которая не применяется к другому элементу, например Rectangle или Ellipse, поэтому вы не видите эффекта .
from kivy.base import runTouchApp
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.label import Label
from kivy.vector import Vector
from kivy.graphics import Color, Ellipse
from kivy.properties import ListProperty
class CircularButton(ButtonBehavior, Label):
background_color = ListProperty((0.5,.5,.5,.5))
def __init__(self, **kwargs):
super(CircularButton,self).__init__(**kwargs)
self.draw()
self.text='test'
def update_shape(self, *args):
self.shape.pos = self.pos
self.shape.size = self.size
def on_background_color(self, *args):
self.shape_color.rgba = self.background_color
def draw(self, *args):
with self.canvas.before:
self.shape_color = Color(rgba=(0.5,.5,.5,.5))
self.shape = Ellipse(pos=self.pos,size=self.size)
self.bind(pos=self.update_shape, size=self.update_shape)
def on_press(self, *args):
self.background_color= (1, 0, 0, 1)
def on_release(self, *arg):
self.background_color = (0.5,.5,.5,.5)
def collide_point(self, x, y):
return Vector(x, y).distance(self.center) <= self.width / 2
if __name__ == '__main__':
runTouchApp(CircularButton())
Хотя я предпочитаю комбинировать .kv и .py, использование языка kv декларативно, что соединения просты:
from kivy.base import runTouchApp
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.label import Label
from kivy.vector import Vector
from kivy.lang import Builder
Builder.load_string('''
<CircularButton>
background_color: 0.5,.5,.5,.5
canvas.before:
Color:
rgba: self.background_color
Ellipse:
pos: self.pos
size: self.size
''')
class CircularButton(ButtonBehavior, Label):
def __init__(self, **kwargs):
super(CircularButton, self).__init__(**kwargs)
self.text = "test"
def on_press(self, *args):
self.background_color = (1, 0, 0, 1)
def collide_point(self, x, y):
return Vector(x, y).distance(self.center) <= self.width / 2
if __name__ == '__main__':
runTouchApp(CircularButton())