Reputation: 1027
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
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