Benedikt Bock
Benedikt Bock

Reputation: 1027

kivy: change the color of a nested button in the root widget with on_press event

I've a widget class SidePanel. It will contain elements of type SidePanelButton. If one SidePanelButton is pressed it will dispatch on_press event to the root widget which is an object of SidePanel (every button will dispatch the same event).

In the called method I would like to change the color of the pressed button (perspectively with an animation). self.background_color = <new value> won't work since self is the SidePanel object. Is there a way to use the pressed button object in that function? Or any other approach?

Complete code and kv definitions:

class SidePanelButton(Button):
    title = StringProperty('')
    '''Titel of the SidePannelButton

       :attr:`title` is a :class:`~kivy.properties.StringProperty` and
       defaults to ''.
    '''

    level = NumericProperty(0.1)
    '''Indentation level of the SidePanelButton :attr:`title`.

       :attr:`level` is a :class:`~kivy.properties.NumericProperty` and defaults to 0.1. The default range
       is between 0.0 and 1.0.
    '''

class SidePanel(StackLayout):

    def __init__(self, **kwargs):
        self.register_event_type('on_button1')
        self.register_event_type('on_press')
        super(SidePanel, self).__init__(**kwargs)

    def on_press(self, *args):
        # not working
        #self.background_color = [1,1,1,1]

        Logger.debug('SidePanel: on_press')
        pass

    def on_button1(self):
        Logger.debug('SidePanel: on_button1')
        pass

------------------------------------------------------------------

<SidePanelButton>:
    size_hint: (1, None)
    height: '48dp'
    background_color: 0.3,0.3,0.3,1
    background_normal: ''
    background_down: ''
    GridLayout:
        rows: 1
        height: self.parent.height
        pos: self.parent.pos
        Widget:
            size_hint: (root.level,1)
        Label:
            markup: True
            size_hint: (1,1)
            text_size: self.size
            text: root.title
            font_size: self.height * 0.4
            halign: 'left'
            valign: 'middle'

<SidePanelButtonL1@SidePanelButton>:
    level: 0.1

<SidePanelButtonL2@SidePanelButton>:
    level: 0.25

<SidePanel>:
    orientation: 'tb-rl'
    canvas:
        Color:
            rgba: 0.3,0.3,0.3,1
        Rectangle:
            pos: self.pos
            size: self.size
    SidePanelButtonL1:
        title: 'Button1'
        on_press: root.dispatch('on_press')
        on_release: root.dispatch('on_button1')
    SidePanelButtonL2:
        title: 'Button2'

Upvotes: 1

Views: 237

Answers (1)

Yoav Glazner
Yoav Glazner

Reputation: 8066

You can just call on_button1 with button object as an argument

...
SidePanelButtonL1:
    title: 'Button1'
    on_press: root.dispatch('on_press')
    on_release: root.on_button1(self)


...
 def on_button1(self, bt1):
    Logger.debug('SidePanel: on_button1 %s' % bt1)
    pass

Upvotes: 1

Related Questions