Kivy:在python中添加内部的widget

时间:2016-09-08 16:47:38

标签: python kivy

如何在未通过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

1 个答案:

答案 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__方法无法使用。