多个屏幕但 self.root.ids 返回错误

Multiple screens but self.root.ids retuns an error

在我添加多个屏幕之前,这段代码确实有效。当我删除多屏幕管理器时它仍然有效。我得到 attrubite 错误指向 Chapter ids 我正在尝试添加章节屏幕。请问我哪里做错了

我认为错误来自 self.root.ids。我可能是错的。下面是代码

Python

from kivymd.app import MDApp
from kivymd.uix.list import OneLineListItem
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.button import MDRectangleFlatIconButton, MDFloatingActionButton
from kivy.lang import Builder
import pygame

pygame.mixer.init()
path = "C://abapp3"


class BooksScreen(Screen):
    pass


class ChapterScreen(Screen):
    pass


class MainApp(MDApp):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(BooksScreen(name='BooksScreen1'))
        sm.add_widget(ChapterScreen(name='ChapterScreen1'))

    return sm

def on_start(self):
    songs = self.load_songs(path)
    pygame.mixer.music.load(songs[0])

def load_songs(self, path_):
    songs = []
    for filename in os.listdir(path_):
        if filename.endswith('.wav'):
            songs.append(os.path.join(path_, filename))
            self.root.ids.Chapter.add_widget(OneLineListItem(text=filename[2:],
                                                         on_release=self.play_song,
                                                         pos_hint={"center_x": 1, "center_y": 1}, ))

    return songs

@staticmethod
def play_song(*args):
    pygame.mixer.music.play()
    print(OneLineListItem.text)

@staticmethod
def stop_song(*args):
    pygame.mixer.music.stop()
    print("song stopped")

MainApp().运行()

.KV

ScreenManager:
    Screen
        BooksScreen:
        ChapterScreen:



<BooksScreen>:
    NavigationLayout:
        ScreenManager:
            Screen:
                # Front / Main Screen
                MDBoxLayout:
                    orientation: "vertical"
                   #Toolbar
                    MDToolbar:
                        title: "Chapters"
                        font_style: "Caption"
                        elevation: 8
                        left_action_items: [['menu', lambda x: nav_drawer.set_state("open")]]

                    Widget:

                #stop/pause Button
                MDBoxLayout:
                    orientation:"vertical"
                #    id: StopButton
                    text:"Pause"

                BoxLayout:
                    Button:
                        text: 'Goto settings'
                        on_press:
                            root.manager.transition.direction = 'left'
                            root.manager.current = 'ChapterScreen1'





                # Chapters list/ Play list
                MDScreen
                    MDBoxLayout:
                        orientation: "vertical"
                        MDList
                            id: Chapter



        #Options menu
        MDNavigationDrawer:
            id: nav_drawer
            MDBoxLayout:
                orientation: "vertical"
                padding: "8dp"
                spacing: "8dp"




                ScrollView:
                    # Options Menu Options
                    MDList:
                        MDRectangleFlatIconButton:
                            on_press:
                                root.ids.nav_drawer.set_state("close")

                            pos_hint: {"center_x": .5, "center_y": .5}
                            icon: 'arrow-left'
                            line_color: 0, 0, 0, 0




                        OneLineIconListItem:
                            text: "Options"
                            font_style: "Caption"
                            #size_hint_y: None
                            #height: self.texture_size[1]

                         # Options Menu- About
                        OneLineIconListItem:
                            text: "About"
                            font_style: "Caption"
                           # size_hint_y: None
                            #height: self.texture_size[1]

                        # Options Menu Storage
                        OneLineIconListItem
                            text: 'Storage'
                            font_style: "Caption"
                            #IconLeftWidget
                                #icon: 'tools'

                        # Options Menu Toolbox
                        OneLineIconListItem:
                            text: 'Choose Voice'
                            font_style: "Caption"

                            #IconLeftWidget:
                            #    icon: 'toolbox'

                        # Options Menu About
                        OneLineIconListItem:
                            text: 'About'
                            font_style: "Caption"
                           # IconLeftWidget:
                            #    icon: 'toolbox-outline'
<ChapterScreen>:
    BoxLayout:
        Button:
            text: 'Back to menu'
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'BooksScreen1'

行:

        self.root.ids.Chapter.add_widget(OneLineListItem(text=filename[2:],
                                                     on_release=self.play_song,
                                                     pos_hint={"center_x": 1, "center_y": 1}, ))

试图引用 Chapter id 就好像它是 ScreenManager (root) ids 的成员一样,但它不是.它是 ids 的成员 BookScreen。您可以通过使用 ScreenManager:

get_screen() 方法在问题行中引用 BookScreen 实例来修复该错误
        self.root.get_screen('BooksScreen1').ids.Chapter.add_widget(OneLineListItem(text=filename[2:],
                                                     on_release=self.play_song,
                                                     pos_hint={"center_x": 1, "center_y": 1}, ))