2016-11-18 68 views
1

我有一個窗口小部件類SidePanel。它將包含SidePanelButton類型的元素。如果一個SidePanelButton被按下,它將調度on_press事件到作爲SidePanel(每個按鈕將分派相同事件)的對象的根部件。kivy:使用on_press事件更改根窗口小部件中嵌套按鈕的顏色

在被調用的方法中,我想更改按下按鈕的顏色(透視動畫)。 self.background_color = <new value>將不起作用,因爲selfSidePanel對象。有沒有辦法在該函數中使用按下的按鈕對象?或者其他方法?

完整代碼和KV定義:

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' 

<[email protected]>: 
    level: 0.1 

<[email protected]>: 
    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' 

回答

1

你可以只是按鈕對象調用on_button1作爲參數

... 
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 
+0

另一個版本叫'root.dispatch( 'on_press',個體經營) '這個方法不會改變。 –

相關問題