2014-03-03 2 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: main.callback() 

MainWidget: 
    id: main 
    TB: 
    TB: 

...하지만 작동하지 않습니다. 내 응용 프로그램과 호환되는 template이 있습니까?

답변

2

문제는 root 키워드의 해결책입니다. 다이나믹 클래스 정의에서 root은 클래스 자체를 나타내며 최종적으로 부모를 의미하지는 않습니다.

버튼이 항상 MainWidget에 추가되어 사용되므로 (확실하게) root 대신 self.parent을 사용할 수 있습니다.

+0

중첩 된 'TB'로 작업 할 수있는 방법이 있습니까? 말하자면, 모든 버튼을 레이아웃에 넣습니다. 그러면'self.parent'는 레이아웃을 참조 할 것입니다. 'self.parent.root'를 참조해야합니까 (아니면 제대로 작동할까요?) 아니면 더 좋은 방법이 있나요? –

+0

방금 ​​self.parent.root를 시도했지만 작동하지 않았습니다. 실제 인스턴스의 루트에 액세스 할 수있는 방법이 있습니까? 또 다른 아이디어 : kivy 파일에'root'라는 이름을 붙일 수 있나요? 그래서 다음 선언에서 그 이름을 참조 할 수 있습니까? –

+0

이것은 나를 위해 작동하지만 self.parent를 GridLayout으로 사용하려면 self.parent.parent.callback()을 사용해야했습니다. –