Python 无法在.build()和.start()之后获得kivy应用程序的屏幕

Python 无法在.build()和.start()之后获得kivy应用程序的屏幕,python,kivy,Python,Kivy,这段代码运行得很好,我可以用大量的动态屏幕启动应用程序,并随之更新菜单列表 from kivy.lang import Builder from kivymd.app import MDApp from kivymd.uix.list import OneLineListItem KV = ''' Screen: MDToolbar: id: toolbar pos_hint: {"top": 1} elevatio

这段代码运行得很好,我可以用大量的动态屏幕启动应用程序,并随之更新菜单列表

from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.list import OneLineListItem

KV = '''
Screen:

    MDToolbar:
        id: toolbar
        pos_hint: {"top": 1}
        elevation: 10
        title: "MDNavigationDrawer"
        left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]]

    NavigationLayout:
        x: toolbar.height

        ScreenManager:
            id: screen_manager

        MDNavigationDrawer:
            id: nav_drawer
            
            BoxLayout:
                canvas:
                    Rectangle:
                        pos: self.pos
                        size: self.size
                orientation: 'vertical'
                padding: "3dp"
                spacing: "8dp"
                AnchorLayout:
                    anchor_x: "center"
                    size_hint:1, None
                    halign: "center"
                    height: img_baniere_avekia_top.height
                    Image:
                        id: img_baniere_avekia_top
                        size_hint: None, None
                        size: "150dp", "93.56dp"
                        source: "menu_image.png"
            
                ScrollView:
                
                    MDList:
                        id: menu_list
'''

screen_kv = '''
Screen:

    MDLabel:
        text: "Screen 1"
        halign: "center"
'''

def chose_screen(widget, nav_drawer, screen_manager, text):
    nav_drawer.set_state("close")
    screen_manager.current = text

def add_tab(nav_drawer, screen_manager, menu_list, screen, title):
    screen.name = title
    menu_element = OneLineListItem(text=title)
    menu_list.add_widget(menu_element)
    screen_manager.add_widget(screen)
    menu_element.bind(on_press = lambda w:chose_screen(w, nav_drawer, screen_manager, title))



class App(MDApp):

    def build(self):
        print("build app")
        self.screen = Builder.load_string(KV)
        return self.screen

    def on_start(self):
        print("start app")
        for title in ["general","info"]:
            self.add_tab(Builder.load_string(screen_kv), title)

    def add_tab(self, screen, title):
        add_tab(self.screen.ids.nav_drawer,
                self.screen.ids.screen_manager,
                self.screen.ids.menu_list,
                screen,
                title)

if __name__ == "__main__":
    app = App()
    app.run()
问题:如果我想在应用程序生成后添加新屏幕,我无法访问app.screen元素!!! app.add_tab()方法不再有效!! 为什么我不能保存应用程序屏幕的引用?我该如何保存此参考资料

下面是一个我想做但失败的例子(同样的代码,我只是更改了结尾,试图在创建后添加_选项卡)


错误消息:“AttributeError:'App'对象没有属性'screen'”

错误消息非常清楚-您的应用没有属性
screen
,因为您尚未设置该属性,而这又是因为您尚未运行生成方法。不要试图在屏幕存在之前修改它

if __name__ == "__main__":
    app = App()
    app.add_tab(Builder.load_string(screen_kv), "Contact Us")
    app.run()