2014-03-03 66 views
1

來看看,我認爲有同等效果如下代碼:kivy事件處理程序模板

main.py是兩個版本是相同的,這是很無聊的:

from kivy.app import App 
from kivy.uix.widget import Widget 

class MainWidget(Widget): 
    def callback(self): 
     pass   

class MainApp(App): 
    pass 

if __name__ == "__main__": 
    MainApp().run()⏎ 

工作main.kv的版本如下:

MainWidget: 
    Button: 
     text: "Buttontext" 
     on_press: root.callback() 
    Button: 
     text: "Buttontext" 
     on_press: root.callback() 

我想對許多按鈕重複一遍!這就是爲什麼我想到一個解決方案看起來像這樣:

<[email protected]>: 
    text: "Buttontext" 
    on_press: root.callback() 

MainWidget: 
    TB: 
    TB: 

這是行不通的。我調整了這樣的例子:

<[email protected]>: 
    text: "Buttontext" 
    on_press: main.callback() 

MainWidget: 
    id: main 
    TB: 
    TB: 

......但那也行不通。 template -feature是否與我的應用程序兼容?

回答

2

您的問題是root關鍵字的分辨率。在你的dyanmic類定義中,root引用類本身,而不是它最終擁有的任何父類。

既然您(大概)確定按鈕將始終被添加到MainWidget使用,您可以使用self.parent而不是root

+0

有沒有辦法使嵌套'TB'的工作?說,我把所有這些按鈕放在一個佈局:然後'self.parent'將引用佈局。我是否必須引用'self.parent.root'(如果可行)還是有更好的方法來做到這一點? –

+0

我只是嘗試self.parent.root,但沒有奏效。有沒有辦法訪問實際實例的根?另一個想法:我可以在kivy文件中爲'root'命名一個名稱,以便我可以在以下聲明中引用該名稱? –

+0

這對我有效,但我需要使用self.parent.parent.callback()作爲self.parent是GridLayout。 –