Search code examples
kivykivymd

Change toolbar title when changing screens in kivymd


My program contains two screens. I wish to change the toolbar title whenever I change screens.

This is my main.py file

from kivymd.app import MDApp
from kivy.lang import Builder
from kivymd.uix.boxlayout import MDBoxLayout
from kivy.properties import ObjectProperty, StringProperty
from kivymd.uix.navigationdrawer import MDNavigationDrawer
from kivymd.uix.navigationdrawer import MDNavigationLayout
from kivy.uix.screenmanager import Screen
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager
from kivymd.uix.toolbar import MDToolbar

Window.size = (360,640)

global sm

class DashboardScreen(Screen):
    def __init__(self, **kwargs):
        super(DashboardScreen, self).__init__(**kwargs)


class DigitalGoldScreen(Screen):
    def __init__(self, **kwargs):
        super(DigitalGoldScreen, self).__init__(**kwargs)


class ContentNavigationDrawer(MDBoxLayout):
    screen_manager = ObjectProperty()
    nav_drawer = ObjectProperty()


# Create the screen manager

sm = ScreenManager()
sm.add_widget(DashboardScreen(name='screen-dash'))
sm.add_widget(DigitalGoldScreen(name='screen-dgld'))



class MoneyManagerCopiedApp(MDApp):
    def __init__(self, **kwargs):
        super(MoneyManagerCopiedApp, self).__init__(**kwargs)



    def set_toolbartitle(self, screen):
        self.title = screen
        return self.title

    def get_toolbartitle(self):


        screentitle = self.title
        if screentitle == "screen-dash":
            self.settitle = "Dashboard"
        elif screentitle == "screen-dgld":
            self.settitle = "Digital Gold"
        else:
            pass

        return (self.settitle)


    def build(self):
        pass

print(sm.current)
if __name__ == "__main__":
    MoneyManagerCopiedApp().run()

Here is my .kv file

<ContentNavigationDrawer>:

    ScrollView:

        MDList:

            OneLineListItem:
                text: "Digital Gold"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "screen-dgld"



            OneLineListItem:
                text: "Dashboard"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "screen-dash"

MDScreen:

    MDToolbar:
        id: toolbar
        pos_hint: {"top": 1}
        elevation: 10
        title: "dashboard"
        left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]]


    MDNavigationLayout:
        ScreenManager:
            id: screen_manager

            DashboardScreen:
            DigitalGoldScreen:


        MDNavigationDrawer:
            id: nav_drawer

            ContentNavigationDrawer:
                screen_manager: screen_manager
                nav_drawer: nav_drawer



<DashboardScreen>:
    name: 'screen-dash'


    MDRectangleFlatButton:
        text: "You're in dashboard screen"
        pos_hint: {'center_x':0.5,'center_y':0.6}
        on_press: root.manager.current = 'screen-dgld'


<DigitalGoldScreen>:
    name: 'screen-dgld'
    MDLabel:
        text: "You're in digigold screen"
        halign: 'center'
    MDRectangleFlatButton:
        text: 'Back'
        pos_hint: {'center_x':0.5,'center_y':0.1}
        on_press: root.manager.current = 'screen-dash'

I found somewhere something related to binding a callback function but I didn't understand that. How do I create such a function and place it inside the toolbar property of MDToolbar in .kv file?


Solution

  • You can just include the change in your on_press for the Button that changes the Screen. Like this:

    <DashboardScreen>:
        name: 'screen-dash'
    
    
        MDRectangleFlatButton:
            text: "You're in dashboard screen"
            pos_hint: {'center_x':0.5,'center_y':0.6}
            on_press:
                root.manager.current = 'screen-dgld'
                app.root.ids.toolbar.title = 'Digital Gold'
    
    
    <DigitalGoldScreen>:
        name: 'screen-dgld'
        MDLabel:
            text: "You're in digigold screen"
            halign: 'center'
        MDRectangleFlatButton:
            text: 'Back'
            pos_hint: {'center_x':0.5,'center_y':0.1}
            on_press:
                root.manager.current = 'screen-dash'
                app.root.ids.toolbar.title = 'Dashboard'