You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过点击NavigationDrawer内按钮修改MDTopAppBar标题?

解决方案

要实现点击导航抽屉按钮时更新顶部标题栏的功能,需要修复原有代码的一处关键错误,并添加标题联动逻辑,以下是具体步骤:

1. 修复布局加载错误

原代码中App.build()方法错误地返回了新建的MainLayout()实例,而非通过Builder.load_file()加载的布局,导致KV文件中的ID和布局无法生效。修改main.py的build方法:

def build(self):
    self.theme_cls.primary_palette = "Green"
    self.theme_cls.theme_style = "Light"
    kivy_layout = Builder.load_file("layout.kv")
    # 返回加载的KV布局,而非新建实例
    return kivy_layout

2. 添加标题联动逻辑

有两种简洁的方式实现标题更新,推荐第一种(适配所有屏幕切换场景):

方法一:监听屏幕切换自动更新标题

在layout.kv的MDScreenManager组件中添加on_current事件,根据当前屏幕名称映射对应标题:

MDScreenManager:
    id: screen_manager
    # 屏幕切换时自动更新标题
    on_current:
        top.title = {
            "scr 1": "Coffee",
            "scr 2": "History",
            "scr 3": "Settings"
        }[self.current]

这种方式的优势是:无论通过导航抽屉还是其他方式切换屏幕,标题都会自动同步,逻辑更健壮。

方法二:直接在抽屉按钮点击事件中设置标题

如果只想通过抽屉按钮点击触发标题更新,可以修改每个MDNavigationDrawerItem的on_press事件,直接使用按钮的文本设置标题:

MDNavigationDrawerItem:
    text: "Coffee"
    icon: "coffee"
    on_press:
        root.nav_drawer.set_state("close")
        root.screen_manager.current = "scr 1"
        # 通过组件层级访问顶部标题栏并设置标题
        root.nav_drawer.parent.parent.ids.top.title = self.text

MDNavigationDrawerItem:
    text: "History"
    icon: "history"
    on_press:
        root.nav_drawer.set_state("close")
        root.screen_manager.current = "scr 2"
        root.nav_drawer.parent.parent.ids.top.title = self.text

MDNavigationDrawerItem:
    text: "Settings"
    icon: "cog"
    on_press:
        root.nav_drawer.set_state("close")
        root.screen_manager.current = "scr 3"
        root.nav_drawer.parent.parent.ids.top.title = self.text

这种方式无需维护标题映射字典,直接复用按钮的文本内容。

修改后的完整代码

main.py

from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.app import MDApp
from kivymd.uix.scrollview import MDScrollView

class MainLayout(Screen):
    pass
    
class NavigationDrawer(MDScrollView):    
    screen_manager = ObjectProperty()
    nav_drawer = ObjectProperty()
    
class App(MDApp):
    def build(self):
        self.theme_cls.primary_palette = "Green"
        self.theme_cls.theme_style = "Light"
        kivy_layout = Builder.load_file("layout.kv")
        return kivy_layout

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

layout.kv(使用方法一的版本)

<NavigationDrawer>

    MDNavigationDrawerMenu:
        
        MDNavigationDrawerHeader:
            title: "MyApp"
            text: "Bottom Text"
            source: "icon64.png"
            spacing: "10dp"
                
        MDNavigationDrawerDivider:
            
        MDNavigationDrawerItem:
            text: "Coffee"
            icon: "coffee"
            on_press:
                root.nav_drawer.set_state("close")
                root.screen_manager.current = "scr 1"

        MDNavigationDrawerItem:
            text: "History"
            icon: "history"
            on_press:
                root.nav_drawer.set_state("close")
                root.screen_manager.current = "scr 2"
            
        MDNavigationDrawerItem:
            text: "Settings"
            icon: "cog"
            on_press:
                root.nav_drawer.set_state("close")
                root.screen_manager.current = "scr 3"

        MDNavigationDrawerDivider:

<MainLayout>
    MDScreen:

        MDTopAppBar:    
            id: top
            title: "Title"
            pos_hint: {"top": 1}
            elevation: 4
            left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]]

        MDNavigationLayout:

            MDScreenManager:
                id: screen_manager
                on_current:
                    top.title = {
                        "scr 1": "Coffee",
                        "scr 2": "History",
                        "scr 3": "Settings"
                    }[self.current]

                MDScreen:
                    name: "scr 1"

                    MDLabel:
                        text: "Coffee"
                        halign: "center"   

                MDScreen:
                    name: "scr 2"

                    MDLabel:
                        text: "History"
                        halign: "center"
                
                MDScreen:
                    name: "scr 3"

                    MDLabel:
                        text: "Settings"
                        halign: "center"

            MDNavigationDrawer:
                id: nav_drawer
                radius: (0, 16, 16, 0)

                NavigationDrawer:
                    screen_manager: screen_manager
                    nav_drawer: nav_drawer

内容的提问来源于stack exchange,提问作者huskreact

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:31:36