2016-09-08 1 views
1

kvlang이 아닌 python으로 추가 된 위젯 내부의 부모에 대한 참조를 어떻게 얻을 수 있습니까? 일반적으로 self.parent을 호출하지만 위젯이 파이썬에 부모에 추가 된 경우 Null을 반환합니다.Kivy : 파이썬에 추가 된 위젯 내부에 부모 가져 오기

예 :

import kivy 
kivy.require('1.9.0') # replace with your current kivy version ! 

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager,Screen 
from kivy.clock import Clock 

kvlang = ''' 
<ScreenManagement>: 
    ScreenOne: 

<ScreenOne>: 
    name: 'First' 


<ScreenTwo>: 
    name: 'Second' 

''' 


class ScreenManagement(ScreenManager): 
    def __init__(self,**kwargs): 
     super().__init__(**kwargs) 

     def setup(*args): 
      self.add_widget(ScreenTwo()) #add ScreenTwo later in python 

     Clock.schedule_once(setup) 

class ScreenOne(Screen): 
    def __init__(self,**kwargs): 
     super().__init__() 

     def setup(*args): 
      print("Parent of ScreenOne: {}".format(self.parent))  #this is working 
     Clock.schedule_once(setup) 

class ScreenTwo(Screen): 
    def __init__(self,**kwargs): 
     super().__init__() 

     def setup(*args): 
      print("Parent of ScreenTwo: {}".format(self.parent))  #this is not working, self.parent will return None 
     Clock.schedule_once(setup) 



class MyApp(App): 

    def build(self): 
     Builder.load_string(kvlang) 
     return ScreenManagement() 


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

이 반환됩니다

Parent of ScreenOne: <__main__.ScreenManagement object at 0x7f98a3fddb40> 
Parent of ScreenTwo: None 
+0

이걸로 무엇을하고 싶니? 아마도 조금 더 많은 컨텍스트가 도움이 될 것입니다. – Juggernaut

+0

부모 클래스의 변수에 액세스하고 싶습니다. 물론 자식 인스턴스화에서 인수로 전달할 수도 있지만, 왜 이것이 가능하지 않은지 궁금합니다. 나는하려고 애쓴다. – Sebastian

답변

1

위젯 add_widget에 추가 실제로 부모에 대한 유효한 참조가 있습니다

from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen 

from kivy.lang import Builder 
Builder.load_string(''' 
<ScreenTwo> 
    Label: 
     text: 'Hello, world'  
''') 

class ScreenManagement(ScreenManager): 
    def __init__(self,**kwargs): 
     super(ScreenManagement, self).__init__(**kwargs) 
     screen = ScreenTwo() 

     print(screen.parent) 
     self.add_widget(screen) 
     print(screen.parent) 


class ScreenTwo(Screen): 
    def on_touch_down(self, *args): 
     print(self.parent) 


class MyApp(App): 
    def build(self): 
     return ScreenManagement() 


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

그것은 단지 사용할 수없는을 그들의 __init__ 방법.

+0

흠, 왜 그런 단서가 없습니까? 'parent = sys._getframe(). f_back.f_locals [ 'self']' – Sebastian

+1

@Sebastian'parent' 속성은 방법이 없기 때문에 위젯을 만들 때 인스턴스화되지 않습니다. 당신이 무엇을 할 것인지 또는 그것이 부모를 가질 것인지 여부를 말합니다. 이 위젯을 일부 계층에 추가 한 후에 만 ​​적절한 값으로 설정할 수 있습니다. 어쨌든 부모 변수를 사용하여 위젯에서 초기화를하고 싶다면'on_parent (self, screen, parent)'메소드를 정의하고 코드를 옮길 수 있습니다. 이 속성이 유효 해지고'parent' 인수를 사용하여 부모에 액세스하자 마자 바로 호출됩니다. – Nykakin