多个屏幕,但self.root.ids重新调整错误 [英] Multiple screens but self.root.ids retuns an error

查看:69
本文介绍了多个屏幕,但self.root.ids重新调整错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在添加多个屏幕之前,此代码实际上一直有效.当我删除多屏幕管理器时,它仍然可以工作.我将attrubite错误点指向章节ID 我正在尝试添加章节屏幕.我我做错了什么.

This code actually worked until I added multiple screens. It still works when I remove the multi Screen Manager. I get the attrubite error point to Chapter ids Im trying to add a chapters screen. What Im I doing wrong please.

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

I think the error is from self.root.ids. I may be wrong. Below is thwe code

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

MainApp().run()

.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 ,但不是.它是 BookScreen ids 的成员.您可以使用 ScreenManager get_screen()方法在问题行中引用 BookScreen 实例来解决该错误:

is trying to reference the Chapter id as if it were a member of the ScreenManager (root) ids, but it is not. It is a member of the ids of the BookScreen. You can fix that error by referencing the BookScreen instance in the problem line using the get_screen() method of ScreenManager:

        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}, ))

这篇关于多个屏幕,但self.root.ids重新调整错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆