ButtonBehavior перезаписывает on_touch_down, on_touch_move и on_touch_up, поэтому если вы используете его, стандартная задача ColorWheel не будет работать правильно, в таких случаях лучше создавать пользовательские события, как показано ниже:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.uix.colorpicker import ColorWheel
class CustomColorWheel(ColorWheel):
def __init__(self, **kwargs):
super(CustomColorWheel, self).__init__(**kwargs)
self.register_event_type('on_press')
self.register_event_type('on_release')
def on_touch_down(self, touch):
res = super(CustomColorWheel, self).on_touch_down(touch)
if res is None:
self.dispatch('on_press')
return res
def on_touch_up(self, touch):
super(CustomColorWheel, self).on_touch_up(touch)
if self.collide_point(*touch.pos) and touch.grab_current is self:
self.dispatch('on_release')
return True
def on_press(self):
pass
def on_release(self):
pass
class Frame(Widget):
def update(self):
color = self.ids['colory']
print(color.color)
Builder.load_string('''
<Frame>:
CustomColorWheel:
id: colory
size: 240, 240
pos: 30, 30
on_press: root.update()
on_release: print('on_release')
''')
class MainApp(App):
def build(self):
return Frame()
if __name__ == '__main__':
MainApp().run()
Еще один более простой вариант - использовать on__hsv
:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
class Frame(Widget):
def update(self):
color = self.ids['colory']
print(color.color)
Builder.load_string('''
<Frame>:
ColorWheel:
id: colory
size: 240, 240
pos: 30, 30
on__hsv: root.update()
''')
class MainApp(App):
def build(self):
return Frame()
if __name__ == '__main__':
MainApp().run()