Kivy:在kvlang中定义的屏幕,如何在python中添加到screenmanager?

时间:2016-02-18 16:29:10

标签: python kivy

如果您有一个具有一个屏幕的screenmanager,请使用kvlang:

<ScreenManagement>:
    ScreenOne:

<ScreenOne>:
    name: 'First'
    id: screen1


<ScreenTwo>:
    name: 'Second'
    id: screen2

可以看出,您还定义了第二个屏幕,但它没有添加到屏幕管理器中。

如何使用python添加它? (我想根据配置文件中的某些条件来做)

我知道我可以使用add_widget()向屏幕管理器添加一个小部件,但我不知道如何从python引用ScreenTwo。

我尝试使用ID,但是我使用此代码得到了一个keyError:

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

        def setup(*args):
            if True:    #under some condition, I want to add ScreenTwo
                #this does not work: KeyError
                screen_widget = App.get_running_app().root.ids['screen2']   
                self.add_widget(screen_widget)

        Clock.schedule_once(setup)

Minimal working example code

2 个答案:

答案 0 :(得分:0)

首先,在kv文件中,确保ScreenTwoScreen<ScreenTwo@Screen>:的子类。其次,尖括号表示规则而不是实际的实例。它只是意味着如果实例化匹配规则的对象,它将获得这些属性。要在Python代码中实例化ScreenTwo的实例,请使用Factory

screen_widget = Factory.ScreenTwo()

答案 1 :(得分:0)

你做错了一些事。首先,<>中的内容称为规则。这些规则控制在Python或kv中调用ScreenOne()时如何创建类。其次,您无法向规则添加ID,然后从根小部件访问该ID。正确的方法是在我的kv文件中。您将ID移至<ScreenManagement>规则。最后,您可以通过执行print self.children始终查看kv文件的内容。

kvlang = '''
<ScreenManagement>:
    ScreenOne:
        id: screen1


<ScreenOne>:
    name: 'First'


<ScreenTwo>:
    name: 'Second'

'''


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

        Clock.schedule_once(self.setup)

    def setup(self,*args):
        if True:    #under some condition, I want to add ScreenTwo
            print self.children, self.current
            self.add_widget(ScreenTwo())
            self.current = 'Second'
            print self.children, self.current
            print self.ids