2016-07-22 99 views
0

我有一個應用程序kivy事件調度,但沒有收到

main.py

import kivy 
kivy.require('1.9.0') # Kivy ver where the code has been tested! 
from kivy.app import App 
from kivy.uix.widget import Widget 

class MyW(Widget): 
    def build(self): 
     pass 

class e3App(App): 
    def build(self): 
     return MyW() 


if __name__ == '__main__': 
    e3App().run() 

e3.kv

#:import PlayListView playlistview 
#:import SPlayView splayview 

<MyW>: 

    SPlayView: 
     Button: 
      on_touch_down:self.parent.buttonPressed() 

    PlayListView: 

splayview.py

from kivy.uix.boxlayout import BoxLayout 

class SPlayView(BoxLayout): 

    def __init__(self,**kwargs): 
     super(SPlayView,self).__init__() 
     self.register_event_type('on_john') 

    def buttonPressed(self): 
     self.dispatch('on_john') 

    def on_john(self): 
     print 'event dispatched' 
以下文件

playlistview.py

from kivy.uix.boxlayout import BoxLayout 

class PlayListView(BoxLayout): 

    def __init__(self,**kwargs): 
     super(PlayListView,self).__init__(**kwargs) 
     self.bind(on_john=self.on_john) 

    def on_john(self): 
     print 'hell' 

當我按下按鈕時看起來好像被分派,但它永遠不會到來......我在做什麼錯了,我一定要某種方式強制的情況下,以泡沫或不被消耗如果是這樣的話。

回答

0

如果您不處理衝突,請勿使用on_touch_down,這與on_release或類似事件不一樣。

build()App類的功能,下一次使用__init__()super()

而且你必須記住,如果你不從你想從訪問該函數的類繼承,它可能無法正常工作 - 您從BoxLayout繼承,而不是從SPlayView繼承。

當你想這種行爲,我可以想出兩種方法:

千伏

#:import PlayListView playlistview 
#:import SPlayView splayview 

<MyW>: 
    SPlayView: 
     Button: 

    PlayListView: 
     Button: 
      on_release:self.parent.buttonPressed() 
  1. 使用功能super()

    class PlayListView(SPlayView): 
    
        def __init__(self,**kwargs): 
         super(PlayListView,self).__init__(**kwargs) 
         self.bind(on_john=self.on_john) 
    
        def on_john(self): 
         print 'hell' 
    

    splayview:

    from kivy.uix.boxlayout import BoxLayout 
    from splayview import SPlayView 
    class PlayListView(SPlayView): 
    
        def __init__(self,**kwargs): 
         super(PlayListView,self).__init__(**kwargs) 
         # self.bind(on_john=self.on_john) 
    
        def on_john(self, *args): 
         super(PlayListView,self).on_john() 
         print 'hell' 
    
  2. 使用bind()

    你不能有相同的名稱

    from kivy.uix.boxlayout import BoxLayout 
    from splayview import SPlayView 
    class PlayListView(SPlayView): 
    
        def __init__(self,**kwargs): 
         super(PlayListView,self).__init__(**kwargs) 
         self.bind(on_john=self.on_johnn) 
    
        def on_johnn(self, *args): 
         print 'hell' 
    

    有你有要記住的是,綁定的功能將被執行第一,然後你的事件函數的函數例如hell將早於event dispatched

打印但是,如果你想從SPlayView調用一些功能,你不必等功能綁定到它,只需調用YourClass.function()on_john事件。我有點困惑,所以我希望你的意思是這樣。 O.o

+0

謝謝,非常感謝 – Flux