首页 > 解决方案 > Kivy:我无法访问 ScreenManager 中存储的所有屏幕

问题描述

我在 ScreenManager 中存储了 3 个屏幕:

我想访问这些存储的屏幕print(self.screen.ids["screen_manager"].children)

预期结果:[<Screen name='page 1'>, <Screen name='page 2'>, <Screen name='page 3'>]

实际结果:[<Screen name='page 1'>]

工作示例:

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()

标签: pythonkivy

解决方案


我确实找到了一个窍门:screen_names方法。

get_screens这是应该在官方库中实现的代码解决方案?

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()

推荐阅读