首页 > 解决方案 > KivyMd 屏幕不变

问题描述

我有这个 python 文件

from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty

from kivymd.app import MDApp
from kivy.lang import Builder

from kivymd.theming import ThemableBehavior, ThemeManager
from kivymd.uix.list import OneLineIconListItem, MDList



class ContentNavigationDrawer(BoxLayout):
    pass

class ItemDrawer(OneLineIconListItem):
    icon = StringProperty()

class MainApp(MDApp):
    def on_start(self):
        icons_item = {
            'bug': 'Files'
        }

        for icon_name in icons_item.keys():
            self.root.ids.content_drawer.ids.md_list.add_widget(
                ItemDrawer(icon=icon_name, text=icons_item[icon_name])
            )

class DrawerList(ThemableBehavior, MDList):

    def set_color_item(self, instance_item):
        # Set the color of the icon and text for the menu item.
        for item in self.children:
            if item.text_color == self.theme_cls.primary_color:
                item.text_color = self.theme_cls.text_color
                break
        instance_item.text_color = self.theme_cls.primary_color

MainApp().run()

而这个 .kv 文件见第 3 行,错误是没有定义 screen_manager

<ItemDrawer>:
    theme_text_color: "Custom"
    on_release: screen_manager.current = 'screen2'

    IconLeftWidget:
        id: icon
        icon: root.icon
        theme_text_color: "Custom"
        text_color: 0,0,0,1

<ContentNavigationDrawer>:
    orientation: "vertical"
    padding: "8dp"
    spacing: "8dp"

    AnchorLayout:
        anchor_x: "left"
        size_hint_y: None
        height: avatar.height

        Image:
            id: avatar
            size_hint: None, None
            size: "250", "250"
            source: "logo.jpg"

    ScrollView:

        DrawerList:
            id: md_list

NavigationLayout:
    ScreenManager:
        id: screen_manager

        Screen:
            name: 'screen1'

            BoxLayout:
                orientation: 'vertical'


                Widget:
                    canvas:
                        Color:
                            rgba: 0,1,0.2117647058823529,0.3
                        Rectangle:
                            size: self.size
                            pos: self.pos
            MDNavigationDrawer:
                id: nav_drawer
                ContentNavigationDrawer:
                    id: content_drawer
        Screen:
            name: 'screen2'


当我单击导航抽屉中的项目时,它说screen_manager 未定义

我究竟做错了什么?我在互联网上搜索了很多,但找不到任何有用的东西

请帮助我,我如何更换屏幕?

标签: pythonkivy-language

解决方案


MDNavigation Drawer 应该与 ScreenManager 处于相同的缩进级别。此外,

        MDNavigationLayout:
            screen_manager:screen_manager
            ScreenManager:
                id: screen_manager
                Screen:
                    name: 'screen1'
                    BoxLayout:
                        orientation: 'vertical'
                        MDToolbar:
                            title: "Navigation Drawer"
                            elevation: 10
                            left_action_items: [['menu', lambda x:nav_drawer.set_state("open")]]
    
                        Widget:
    
                Screen:
                    name: 'screen2'
                    
            MDNavigationDrawer:
                id: nav_drawer
                ContentNavigationDrawer:
                    id: content_drawer

添加

screen_manager:screen_manager 

在 NavigationLayout 下方,以便它可以作为ObjectProperty访问。最后将 ItemDrawer 回调从

on_release: screen_manager.current = 'screen2'

on_release: app.root.screen_manager.current = 'screen2'

最后你还可以添加

nav_drawer: nav_drawer 

在您的根窗口下方,并且位于该行的顶部/下方screen_manager: screen_manager 这可以在弹出新屏幕关闭导航抽屉

然后将您的回调更新为此:

on_release:
    app.root.screen_manager.current = 'screen2'
    app.root.nav_drawer.set_state('close')

推荐阅读