簡體   English   中英

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

[英]Kivy: screen defined in kvlang, how to add to screenmanager in python?

當您擁有一個帶有一個屏幕的屏幕管理器時,請使用kvlang:

<ScreenManagement>:
    ScreenOne:

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


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

可以看到,您還定義了第二個屏幕,但是沒有將其添加到屏幕管理器中。

如何使用python添加它? (我想根據配置文件中的某些條件來執行此操作)

我知道我可以使用add_widget()將小部件添加到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)

最少的工作示例代碼

首先,在您的kv文件中,確保ScreenTwoScreen的子類: <ScreenTwo@Screen>: 其次,尖括號表示規則而非實際實例。 這只是意味着,如果實例化與規則匹配的對象,它將獲得這些屬性。 要在Python代碼中實例化ScreenTwo的實例,請使用Factory

screen_widget = Factory.ScreenTwo()

您做錯了幾件事。 首先, <>中的內容稱為規則。 這些規則控制着在Python或kv中調用ScreenOne()時如何ScreenOne() 其次,您無法將ID添加到規則,然后無法從根窗口小部件訪問該ID。 正確的方法是在我的kv文件中。 您將id移到<ScreenManagement>規則中。 最后,您可以通過執行print self.children始終查看kv文件的print self.children

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM