2016-09-08 21 views
1

kvlangによって追加されていないがPythonでウィジェット内の親への参照を取得するにはどうすればよいですか? 通常、self.parentを呼び出すだけですが、ウィジェットがPythonで親に追加された場合はNullが返されます。Kivy:Pythonで追加されたウィジェット内で親を取得

例:

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

関連する問題