如何在未通过kvlang但在python中添加的窗口小部件中获取父窗口的引用。
通常,您只需调用self.parent
,但如果在python中将小部件添加到父级,则会返回Null
。
一个例子:
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 :(得分:2)
添加了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__
方法无法使用。