0

I'm using KivyMD framework and I'm trying to manage screens from classes but I don't know how to do it. NavigationDrawer should be manageable in every screens.

I want to make, 5 different screens:

  1. Home Screen for welcome message.
  2. Football screen
  3. Basketball screen
  4. Volleyball screen
  5. News screen

Here's example of my code:

from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen

from kivymd.app import MDApp

KV = '''
<ContentNavigationDrawer>:

    ScrollView:

        MDList:

            OneLineListItem:
                icon: 'soccer'
                text: "Football"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "scr 1"

            OneLineListItem:
                text: "Basketball"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "scr 2"
            OneLineListItem:
                text: "Screen 3"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "scr 3"

            OneLineListItem:
                text: "Screen 4"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "scr 4"

Screen:

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

    MDNavigationLayout:
        x: toolbar.height

        ScreenManager:
            id: screen_manager

            Screen:
                name: "scr 1"

                MDLabel:
                    icon: 'soccer'
                    text: "Football"
                    halign: "center"

            Screen:
                name: "scr 2"

                MDLabel:
                    text: "Basketball"
                    halign: "center"
            Screen:
                name: "scr 3"

                MDLabel:
                    text: "Screen 3"
                    halign: "center"

            Screen:
                name: "scr 4"

                MDLabel:
                    text: "Screen 4"
                    halign: "center"

        MDNavigationDrawer:
            id: nav_drawer

            ContentNavigationDrawer:
                screen_manager: screen_manager
                nav_drawer: nav_drawer
'''

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


class Sports(MDApp):
    def build(self):
        return Builder.load_string(KV)


Sports().run()

With classified version:

from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen

from kivymd.app import MDApp

KV = '''

<ScrManage>:
    HomeScreen:
        name: 'home'
    FBScreen:
        name: 'football'
    BBScreen:
        name: 'basketball'
    VBScreen:
        name: 'volleyball'
    NScreen:
        name: 'news'

    ScrollView:

        MDList:

            OneLineListItem:
                text: "Home"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "home"

            OneLineListItem:
                icon: 'soccer'
                text: "Football"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "football"

            OneLineListItem:
                text: "Basketball"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "basketball"
            OneLineListItem:
                text: "Volleyball"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "volleyball"
            OneLineListItem:
                text: "News"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "news"


    MDNavigationDrawer:
        id: nav_drawer

        ContentNavigationDrawer:
            screen_manager: screen_manager
            nav_drawer: nav_drawer


<HomeScreen>:

    Screen:

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

        MDNavigationLayout:
            x: toolbar.height

            ScreenManager:
                id: screen_manager

<FBScreen>:
    Screen:
        name: "football"

        MDLabel:
            text: "Football"
            halign: "center"

<BBScreen>:
    Screen:
        name: "basketball"

        MDLabel:
            text: "Basketball"
            halign: "center"

<VBScreen>:
    Screen:
        name: "volleyball"

        MDLabel:
            text: "Volleyball"
            halign: "center"
<NScreen>:
    Screen:
        name: "news"

        MDLabel:
            text: "News"
            halign: "center"

'''

class HomeScreen(Screen):
    pass
class FBScreen(Screen):
    pass
class BBScreen(Screen):
    pass
class VBScreen(Screen):
    pass
class NScreen(Screen):
    pass



class ScrManage(ScreenManager):
    pass

class Sports(MDApp):
    def build(self):
        return Builder.load_string(KV)


Sports().run()

Returning empty screen. Just white.

Thanks.

Yavuz
  • 1
  • 1
  • Are you getting a error? – John Anderson Jan 15 '21 at 18:21
  • @JohnAnderson I don't know how to do it with classes. But I'm trying to manage from class and I get a empty screen (only white screen). I updated my code with classed version. – Yavuz Jan 15 '21 at 18:57
  • The line `return Builder.load_string(KV)` returns `None`, which causes your white screen. You should change that to `Builder.load_string(KV)` followed by `return ScrManage()`. Then you will encounter other errors. – John Anderson Jan 15 '21 at 19:48
  • @JohnAnderson I changed to `return ScrManage()` Still returning white screen. – Yavuz Jan 15 '21 at 19:57

0 Answers0