AttributeError: 'super' object has no attribute '__getattr__' KivyMD

问题描述 投票:0回答:1

我正在学习 KivyMD,我正在尝试添加下拉菜单,但出现此错误。这可能是因为我对 id 的错误使用,但我仍然无法弄清楚。这是我的主要 py 代码:

from kivymd.app import MDApp
from kivy.lang import Builder
from kivymd.uix.screenmanager import ScreenManager
from kivymd.uix.screen import Screen
from kivymd.uix.menu import MDDropdownMenu

from kivy.metrics import dp
from kivy.core.window import Window

Window.size = (500, 800)

class HomePage(Screen):
    pass

class SecondPage(Screen):
    pass

class App(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.screen = Builder.load_file("kivy.kv")
        items_d = ['Settings', 'Profile', 'Log Out', 'Exit']
        menu_items = [
            {
                "text": f"{i}",
                "viewclass": "OneLineListItem",
                "height": dp(40),
                "on_release": lambda x=f"{i}": self.menu_callback(x),
            } for i in items_d
        ]
        self.menu = MDDropdownMenu(
            caller = self.screen.ids.tool1,
            items = menu_items,
            width_mult =2
        )

    def menu_callback(self, text_item):
        print(text_item)
        self.menu.dismiss()

    def build(self):
        self.theme_cls.primary_palette = 'Red'
        self.theme_cls.primary_hue = '500'
        self.theme_cls.theme_style = 'Dark'

        sm = ScreenManager()
        sm.add_widget(HomePage(name='first'))
        sm.add_widget(SecondPage(name='second'))

        return self.screen
    

App().run()

这是 kv 文件:

#:kivy 2.1.0

ScreenManager:
    HomePage:
    SecondPage:

<HomePage>
    name: 'first'

    MDNavigationLayout:
        ScreenManager:
            Screen:
                BoxLayout:
                    orientation:'vertical'

                    MDTopAppBar:
                        id:tool1
                        title: 'Home Page'
                        left_action_items: [['menu', lambda x: nav_drawer.set_state('toggle')]]
                        right_action_items: [['dots-vertical'], lambda x: app.menu.open()]
                        elevation: 3

                    MDLabel:
                        text: "."

                    MDBottomAppBar:
                        MDTopAppBar:
                            icon: 'apps'
                            mode: 'center'
                            type: 'bottom'
                            

        MDNavigationDrawer:
            id: nav_drawer

            ScrollView:
                MDList:
                    OneLineIconListItem:
                        text: 'Home Page'
                        on_press: nav_drawer.set_state('close')
                        on_press: root.manager.current = 'first'

                        IconLeftWidgetWithoutTouch:
                            icon:'bluetooth'

                    OneLineIconListItem:
                        text: 'Content Page'
                        on_press: root.manager.current = 'second'
                        on_press: nav_drawer.set_state('close')
                                
                        IconLeftWidgetWithoutTouch:
                            icon:'content-copy'


<SecondPage>
    name: 'second'

    MDNavigationLayout:
        ScreenManager:
            Screen:
                BoxLayout:
                    orientation:'vertical'

                    MDTopAppBar:
                        id:tool1
                        title: 'Content Page'
                        left_action_items: [['menu', lambda x: nav_drawer.set_state('toggle')]]
                        right_action_items: [['dots-vertical'], lambda x: app.menu.open()]
                        elevation: 3

                    MDLabel:
                        text: "."

                    MDBottomAppBar:
                        MDTopAppBar:
                            type: 'bottom'
                            icon: 'apps'
                            mode: 'center'
                            left_action_items: [['information']]

        MDNavigationDrawer:
            id: nav_drawer

            ScrollView:
                MDList:
                    OneLineIconListItem:
                        text: 'Home Page'
                        on_press: nav_drawer.set_state('close')
                        on_press: root.manager.current = 'first'

                        IconLeftWidgetWithoutTouch:
                            icon:'bluetooth'

                    OneLineIconListItem:
                        text: 'Second Page'
                        on_press: nav_drawer.set_state('close')
                        on_press: root.manager.current = 'second'

                        IconLeftWidgetWithoutTouch:
                            icon:'wifi'

我不知道为什么,但可能是因为 self.screen 并不真正包含 ids? 如果我使用了错误的方法,请告诉我应该使用什么。

python kivy attributeerror kivymd getattr
1个回答
0
投票

您正在错误地尝试访问

tool1
id
。首先,请注意,在
ids
文件中定义的
kv
成为定义该
ids
的规则根的
id
字典的一部分。所以
tool1
id
(定义两次)最终出现在
ids
HomePage
ids
SecondPage
中。所以你必须通过包含对象引用那个
id
。假设你想引用
tool1
中定义的
HomePage
,只需更改:

caller = self.screen.ids.tool1,

至:

caller = self.screen.get_screen('first').ids.tool1,

不相关,但你可以删除这些行:

    sm = ScreenManager()
    sm.add_widget(HomePage(name='first'))
    sm.add_widget(SecondPage(name='second'))

因为他们的结果未被使用。

© www.soinside.com 2019 - 2024. All rights reserved.