简体   繁体   中英

Kivy: I can't access all stored Screens in the ScreenManager

I store 3 Screen in the ScreenManager:

I want to acces theses stored Screens with print(self.screen.ids["screen_manager"].children)

Result expected: [<Screen name='page 1'>, <Screen name='page 2'>, <Screen name='page 3'>]

Actual result: [<Screen name='page 1'>]

Working example:

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from page import Page

KV = '''
BoxLayout:
    NavigationLayout:
        id: nav_layout
        ScreenManager:
            id: screen_manager
    Button: 
        text: "Yes"
'''

class TestApp(MDApp):
    def build(self):
        self.screen = Builder.load_string(KV)
        self.screen.ids["screen_manager"].add_widget(Screen(name="page 1"))
        self.screen.ids["screen_manager"].add_widget(Screen(name="page 2"))
        self.screen.ids["screen_manager"].add_widget(Screen(name="page 3"))
        return self.screen

    def on_start(self):
        print(self.screen.ids["screen_manager"].children)

if __name__ == '__main__':
    TestApp().run()

I did find a trick: screen_names method.

Here is the code solution with the get_screens that should be implemented in the official lib?

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from page import Page

KV = '''
BoxLayout:
    NavigationLayout:
        id: nav_layout
        ScreenManager:
            id: screen_manager
    Button: 
        text: "Yes"
'''

class TestApp(MDApp):
    def build(self):
        self.screen = Builder.load_string(KV)
        self.screen.ids["screen_manager"].add_widget(Screen(name="page 1"))
        self.screen.ids["screen_manager"].add_widget(Screen(name="page 2"))
        self.screen.ids["screen_manager"].add_widget(Screen(name="page 3"))
        return self.screen

    def on_start(self):
        print(self.get_screens())

    def get_screens(self):
        return [self.screen.ids["screen_manager"].get_screen(name) for name in self.screen.ids["screen_manager"].screen_names]

if __name__ == '__main__':
    TestApp().run()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM