Color widget, first steps (2)

                Never    
from kivy.app import App
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.uix.widget import Widget

from kivy.properties import (
                             ListProperty,
                             NumericProperty,
                             BoundedNumericProperty
                             )
from kivy.core.window import Window

from colorsys import hls_to_rgb

KV = '''

BoxLayout
    orientation:'vertical'
    ColourWidget
        id: color_widget
        s_slider: slider
    BoxLayout
        size_hint_y:0.2
        Label
            size_hint_x:0.2
            text: 'saturation:'
        Slider
            id: slider
            min:0
            max:1
            value:color_widget.saturation
            on_value: if color_widget.saturation!= args[1]:  color_widget.saturation = args[1]

<ColourWidget>:
    canvas:
        Color:
            rgb: self.colour


        Rectangle:
            pos: self.pos
            size: self.size

'''

class ColourApp(App):
    def build(self):
        self.root = Builder.load_string(KV)

class MyProperty(BoundedNumericProperty): 
    def __init__(self, *args, my_min=0, my_max=1, **kwargs):
         super().__init__(*args, min=my_min, max=my_max, errorhandler=lambda x: min(max(x, my_min), my_max), **kwargs)


class ColourWidget(Widget):
    colour = ListProperty([0, 0, 0])
    saturation = MyProperty(
                                        0.1,
                                        my_min=0,
                                        my_max=1.)

    def slider_error_value_handler(self, instance, val):
        new_val = val
        if val> 1.:
            new_val = 1.
        elif val<0.:
            new_val = 0.
        return new_val

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Window.bind(mouse_pos=self.on_mouse)


    def on_mouse(self,instance, value):
        self.mouse = value

        self.update_colour(value)


    def update_colour(self, value):
        x, y = value

        x /= Window.size[0]
        y /= Window.size[1]

#        self.colour = hls_to_rgb(0.7+x/5, 0.1+y/10, 0.2)
        self.colour = hls_to_rgb(0.7+x/5, 0.1+y/8, self.saturation)



    def on_touch_down(self, touch):

        if touch.is_mouse_scrolling:
            
            if touch.button == 'scrolldown':
                self.saturation +=0.01
            elif touch.button == 'scrollup':
                self.saturation -=0.01

            self.update_colour(self.mouse)

        super(ColourWidget, self).on_touch_down(touch)



ColourApp().run()

Raw Text