首页 > 解决方案 > Kivy - 如何在不同的文件中分屏?

问题描述

我在将 kv 文件包含到另一个文件时遇到问题。我想为每个屏幕设置单独的文件并将它们包含在“main.kv”中,但是我对拆分文件中的访问标识/组件有疑问。

见错误:

文件“screen_home.kv”,第 9 行,在 left_action_items: [['menu', lambda x: nav_drawer.set_state("open")]] NameError: name 'nav_drawer' is not defined

查看包含的文件:

主文件

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout


class ContentNavigationDrawer(BoxLayout):
    pass


class mainApp(MDApp):
    title = "mainApp"
    app_name = title

    def build(self):
        return Builder.load_file("main.kv")


if __name__ == "__main__":
    mainApp().run()

主文件

#:include screen_home.kv

<ContentNavigationDrawer>:
    orientation: "vertical"
    padding: "8dp"
    spacing: "8dp"
    AnchorLayout:
        anchor_x: "center"
        size_hint_y: None
        height: app_logo.height
        Image:
            id: app_logo
            size_hint: None, None
            size: "80dp", "80dp"
            source: "./res/images/logo.png"
    MDLabel:
        text: app.app_name
        halign: "center"
        font_style: "Subtitle2"
        size_hint_y: None
        height: self.texture_size[1]
    ScrollView:
        MDList:
            OneLineAvatarIconListItem:
                text: "Home"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "screen_home"
                IconLeftWidget:
                    icon: "home"
                    valign: 'center'

            OneLineAvatarIconListItem:
                text: "Screen 1"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "screen_1"
                IconLeftWidget:
                    icon: "scatter-plot"

Screen:
    NavigationLayout:
        ScreenManager:
            id: screen_manager
            ScreenHome:
            Screen:
                name: "screen_1"
                BoxLayout:
                    orientation: 'vertical'

                    MDToolbar:
                        title: "First Screen"
                        elevation: 10
                        left_action_items: [['menu', lambda x : nav_drawer.set_state("open")]]

                    BoxLayout:
                        orientation: 'horizontal'
                        MDLabel:
                            halign: "center"
                            valign: "center"
                            text: "Label on screen_1"

        MDNavigationDrawer:
            id: nav_drawer

            ContentNavigationDrawer:
                screen_manager: screen_manager
                nav_drawer: nav_drawer

screen_home.kv

<ScreenHome@Screen>:
    name: "screen_home"
    BoxLayout:
        orientation: 'vertical'

        MDToolbar:
            title: "Home"
            elevation: 10
            left_action_items: [['menu', lambda x: nav_drawer.set_state("open")]]
        Widget:
            canvas:
                Color:
                    rgb: 0, 1, 0
                Rectangle:
                    size: (800,200)
        Widget:
            MDLabel:
                text: "Home screeen"
                size: root.width, root.height
                halign: 'center'
                valign: 'center'

标签: pythonkivy

解决方案


推荐阅读