Search code examples
pythonkivykivymd

kivy.uix.screenmanager.ScreenManagerException: No Screen with name "login"


I am trying to use a transition so that when selecting the "Log Out" button - the screen transitions to the left (giving the appearance of going from forwards to backwards).

This is for a help desk I am trying to design and I can't work out why its returning this error when I can perform this transition for other screens in my navbar.

I am new to Kivy and my code will probably upset anyone that views this in some way. Please go easy - but seriously any help is appreciated.


from kivy import Config
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.image import Image
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivymd.app import MDApp
from kivy.uix.boxlayout import BoxLayout
from kivymd.theming import ThemableBehavior
from kivymd.uix.navigationdrawer import MDNavigationLayout, MDNavigationDrawer
from kivymd.uix.list import MDList, OneLineAvatarListItem, ILeftBody
from kivy.properties import ObjectProperty
from kivy.uix.widget import Widget


Config.set('input', 'mouse', 'mouse,disable_multitouch')


class DrawerList(ThemableBehavior, MDList, Screen):
    pass


class NavLayout(MDNavigationLayout):
    pass


class Login(Screen):
    nav_drawer = ObjectProperty()


class Nav(Screen):
    Login = ObjectProperty()
    ScreenManager = ObjectProperty


class Homepage(Screen):
    Login = ObjectProperty()
    nav_drawer = ObjectProperty()


class AddNewCustomer(Screen):
    nav_drawer = ObjectProperty()


class AddNewStaff(Screen):
    pass


class ScreenManager(ScreenManager):
    Login = ObjectProperty()


class ContentNavigationDrawer(BoxLayout):
    pass


class MainApp(MDApp):
    def build(self):
        # Window.maximize()
        # self.theme_cls.theme_style = "Light"
        # self.theme_cls.primary_hue = "900"
        login = Builder.load_file("login.kv")
        return login


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


ScreenManager:
    Login:
    Homepage:
    AddNewCustomer:
    Nav:
    DrawerList:

<Login>:
    name: "login"
    MDCard:
        size_hint: None, None
        size: 700, 800
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        elevation: 10
        padding: 25
        spacing: 25
        orientation: 'vertical'

        Image:
            source: 'images/asteria.png'
            size: 100, 200

        MDLabel:
            id: login
            font_size: 40
            halign: 'center'
            size_hint_y: None
            height: self.texture_size[1]
            padding_y: 15

        MDTextFieldRound:
            id: user
            hint_text: "username"
            icon_right: "account"
            size_hint_x: None
            width: 200
            font_size: 18
            pos_hint: {"center_x": 0.5}

        MDTextFieldRound:
            id: password
            hint_text: "password"
            icon_right: "eye-off"
            size_hint_x: None
            width: 200
            font_size: 18
            pos_hint: {"center_x": 0.5}
            password: True

        MDRoundFlatButton:
            text: "LOGIN"
            font_size: 12
            pos_hint: {"center_x": 0.5}

            on_release:
                root.manager.current = "homepage"
                root.manager.transition.direction = "left"

        MDRoundFlatButton:
            text: "CLEAR"
            font_size: 12
            pos_hint: {"center_x": 0.5}
            on_press: app.clear()


        Widget:
            size_hint_y: None
            height: 50


<Nav>:
    ScrollView:
        MDList:
            OneLineListItem:
                text: "Add New Customer"

                on_release:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "addNewCustomer"
                    root.screen_manager.transition.direction = "right"





            OneLineListItem:
                text: "Add New Staff"
                font_size: 15
                halign: "center"
                on_release:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "addNewStaff"

            OneLineListItem:
                text: "Case List"
                font_size: 15
                halign: "center"
                on_release:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "caseList"


            OneLineListItem:
                text: "Log Out"
                font_size: 15
                halign: "center"
                on_release:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.transition.direction = "left"
                    root.screen_manager.current = "login"









<Homepage>:
    name: "homepage"
    Screen:
        BoxLayout:
            orientation: 'vertical'
            MDToolbar:
                title: 'Navigation'
                left_action_items: [['menu', lambda x: nav_drawer.set_state('toggle')]]
                right_action_items: [["images/asteria.png", lambda x: None]]


                elevation:5
            Widget:


        MDNavigationDrawer:
            id: nav_drawer
            Nav:
                screen_manager: screen_manager
                nav_drawer: nav_drawer


        MDNavigationLayout:
            ScreenManager:
                id: screen_manager
                Screen:
                    name: "Homepage"
                    MDLabel:
                        text: "Welcome Home"
                        halign: "center"


                Screen:
                    name: "addNewCustomer"
                    MDLabel:
                        text: "Add New customer"
                        halign: "center"

                Screen:
                    name: "addNewStaff"
                    MDLabel:
                        text: "Add New Staff"
                        halign: "center"

                Screen:
                    name: "caseList"
                    MDLabel:
                        text: "Case List"
                        halign: "center"

                Screen:
                    name: "casePool"
                    MDLabel:
                        text: "Case Pool"
                        halign: "center"

Solution

  • You have two screen_managers, you need to refer to the one containing the <Login> Screen. So simply change the .kv file:

    This line in <Nav>:

    OneLineListItem:
        text: "Log Out"
        font_size: 15
        halign: "center"
        on_release:
            root.nav_drawer.set_state("close")
            root.screen_manager.transition.direction = "left"
            root.manager.current = "login"
    

    And this line in <Hompage>:

    MDNavigationDrawer:
        id: nav_drawer
        Nav:
            screen_manager: screen_manager
            nav_drawer: nav_drawer
            manager: root.manager
    

    Full .kv file:

    ScreenManager:
        Login:
        Homepage:
        AddNewCustomer:
        Nav:
        DrawerList:
    
    <Login>:
        name: "login"
        MDCard:
            size_hint: None, None
            size: 700, 800
            pos_hint: {"center_x": 0.5, "center_y": 0.5}
            elevation: 10
            padding: 25
            spacing: 25
            orientation: 'vertical'
    
            Image:
                source: 'images/asteria.png'
                size: 100, 200
    
            MDLabel:
                id: login
                font_size: 40
                halign: 'center'
                size_hint_y: None
                height: self.texture_size[1]
                padding_y: 15
    
            MDTextFieldRound:
                id: user
                hint_text: "username"
                icon_right: "account"
                size_hint_x: None
                width: 200
                font_size: 18
                pos_hint: {"center_x": 0.5}
    
            MDTextFieldRound:
                id: password
                hint_text: "password"
                icon_right: "eye-off"
                size_hint_x: None
                width: 200
                font_size: 18
                pos_hint: {"center_x": 0.5}
                password: True
    
            MDRoundFlatButton:
                text: "LOGIN"
                font_size: 12
                pos_hint: {"center_x": 0.5}
    
                on_release:
                    root.manager.current = "homepage"
                    root.manager.transition.direction = "left"
    
            MDRoundFlatButton:
                text: "CLEAR"
                font_size: 12
                pos_hint: {"center_x": 0.5}
                on_press: app.clear()
    
    
            Widget:
                size_hint_y: None
                height: 50
    
    
    <Nav>:
        ScrollView:
            MDList:
                OneLineListItem:
                    text: "Add New Customer"
    
                    on_release:
                        root.nav_drawer.set_state("close")
                        root.screen_manager.current = "addNewCustomer"
                        root.screen_manager.transition.direction = "right"
    
    
    
    
    
                OneLineListItem:
                    text: "Add New Staff"
                    font_size: 15
                    halign: "center"
                    on_release:
                        root.nav_drawer.set_state("close")
                        root.screen_manager.current = "addNewStaff"
    
                OneLineListItem:
                    text: "Case List"
                    font_size: 15
                    halign: "center"
                    on_release:
                        root.nav_drawer.set_state("close")
                        root.screen_manager.current = "caseList"
    
    
                OneLineListItem:
                    text: "Log Out"
                    font_size: 15
                    halign: "center"
                    on_release:
                        root.nav_drawer.set_state("close")
                        root.manager.transition.direction = "left"
                        root.manager.current = "login"
    
    
    <Homepage>:
        name: "homepage"
        Screen:
            BoxLayout:
                orientation: 'vertical'
                MDToolbar:
                    title: 'Navigation'
                    left_action_items: [['menu', lambda x: nav_drawer.set_state('toggle')]]
                    right_action_items: [["images/asteria.png", lambda x: None]]
    
    
                    elevation:5
                Widget:
    
    
            MDNavigationDrawer:
                id: nav_drawer
                Nav:
                    screen_manager: screen_manager
                    nav_drawer: nav_drawer
                    manager: root.manager
    
    
            MDNavigationLayout:
                ScreenManager:
                    id: screen_manager
                    Screen:
                        name: "Homepage"
                        MDLabel:
                            text: "Welcome Home"
                            halign: "center"
    
                    Screen:
                        name: "addNewCustomer"
                        MDLabel:
                            text: "Add New customer"
                            halign: "center"
    
                    Screen:
                        name: "addNewStaff"
                        MDLabel:
                            text: "Add New Staff"
                            halign: "center"
    
                    Screen:
                        name: "caseList"
                        MDLabel:
                            text: "Case List"
                            halign: "center"
    
                    Screen:
                        name: "casePool"
                        MDLabel:
                            text: "Case Pool"
                            halign: "center"