even if the screen exist the kivyMD is rasing error : kivy.uix.screenmanager.ScreenManagerException: No Screen with name "Main_page"

even if the screen exist the kivyMD is rasing error : kivy.uix.screenmanager.ScreenManagerException: No Screen with name "Main_page"

现在我已经使用 kivyMD 完成了整个项目,我是新手,我想要的只是登录,但出于某种原因,它显示屏幕不存在的错误,我尝试了所有方法,但没有任何帮助将不胜感激。 现在这里是主要的 .py 文件。

Builder.load_file("welcome.kv")
class Login_page(Screen):
    def validate_user(self):
        self.sm = ScreenManager(transition=NoTransition())
        print(details.keys())
        Username = MainApp.get_running_app().root.get_screen('Login_Page').ids.Username.text
        if Username in list(details.keys()):
            if details[Username] == MainApp.get_running_app().root.get_screen('Login_Page').ids.Password.text:
                self.manager.current = "Main_page"
        else:
            print("not here")
class ScreenManagement(ScreenManager):
    pass
class Main_page(Screen):
    pass
class MainApp(MDApp):
    def build(self):
        self.sm = ScreenManager(transition=NoTransition())
        self.sm.add_widget(Login_page(name = "Login_Page"))
        self.sm.add_widget(Sign_in_Page(name="Sign_in_Page"))
        self.sm.add_widget(Main_page(name = "Main_page"))
        self.sm.add_widget(Billings_Table(name="Billings_Table"))
        self.sm.add_widget(Employee_Table(name="Employee_Table"))
        self.sm.add_widget(Courier_Order_and_Details(name = "Courier_Order_and_Details"))
        return self.sm

下面是.kv部分

<Login_Page>:
    name : "Login_Page"
    MDScreen:
        MDToolbar:
            title : "Courier Service System"
            pos_hint : {"top":1}
        Image :
            source : "courier_design(256256).png"
            pos_hint : {'center_x':0.5,'center_y':0.7}
        MDTextField :
            id : Username
            hint_text: "Enter Username"
            halign : "center"
            size_hint : (0.25, 0.10)
            pos_hint : {'center_x': 0.5, 'center_y': 0.45}
            font_size : 12
        MDTextField :
            id : Password
            hint_text : "Password"
            halign : "center"
            size_hint : (0.25, 0.1)
            pos_hint : {'center_x': 0.5, 'center_y': 0.35}
            font_size : 12
            password : True
        MDFillRoundFlatButton :
            text : "Log in"
            font_size : 12
            size_hint : (0.25,0.05)
            pos_hint : {'center_x' : 0.5,'center_y' : 0.28}
            on_release: app.validate_user()
        MDLabel :
            text : "——————— or ———————"
            font_size : 15
            size_hint : (0.25, 0.05)
            pos_hint : {'center_x': 0.508, 'center_y': 0.23}
            theme_text_color : "Secondary"
        MDFillRoundFlatButton :
            text : "Sign in"
            font_size : 12
            size_hint : (0.25, 0.05)
            pos_hint : {'center_x': 0.5, 'center_y': 0.18}
            on_release: app.root.current = "Sign_in_Page"
<Main_page>
    name : "Main_page"
    MDScreen:
        MDLabel :
            text : "Our Services :"
            align : "center"
            font_size : 30
            size_hint : (0.5, 0.5)
            pos_hint : {'center_x': 0.5, 'center_y': 0.8}
            theme_text_color : "Secondary"
        MDToolbar:
            title: "Back"
            left_action_items: [["arrow-left",  lambda x: app.change_screen("Login_Page")]]
            pos_hint : {"top":1}
            font_size : 15

        MDFillRoundFlatButton :
            text : "Courier Order and Courier Details"
            font_size : 14
            size_hint : (0.4, 0.09)
            pos_hint : {'center_x': 0.5, 'center_y': 0.6}
            on_release: app.root.current = "Courier_Order_and_Details"
        MDFillRoundFlatButton :
            text : "Billings Details"
            font_size : 14
            size_hint : (0.4, 0.09)
            pos_hint : {'center_x': 0.5, 'center_y': 0.4}
            on_release: app.root.current = "Billings_Table"
        MDFillRoundFlatButton :
            text : "Our Employees"
            font_size : 14
            size_hint : (0.4, 0.09)
            pos_hint : {'center_x': 0.5, 'center_y': 0.2}
            on_release: app.root.current ='Employee_Table'

现在有两个验证码,我知道我写的时候用的第一个

root.validate_user

仍然遇到类似的问题

在使用kivymd构建大型应用时,使用屏幕管理器作为应用的根会更有效。这意味着 kv 填充看起来像这样

#: import NoTransition kivy.uix.screenmanager.NoTransition

<LoginPage>:
     MDScreen:
        MDToolbar:
            title : "Courier Service System"
            pos_hint : {"top":1}
        Image :
            source : "courier_design(256256).png"
            pos_hint : {'center_x':0.5,'center_y':0.7}
        MDTextField :
            id : Username
            hint_text: "Enter Username"
            halign : "center"
            size_hint : (0.25, 0.10)
            pos_hint : {'center_x': 0.5, 'center_y': 0.45}
            font_size : 12
        MDTextField :
            id : Password
            hint_text : "Password"
            halign : "center"
            size_hint : (0.25, 0.1)
            pos_hint : {'center_x': 0.5, 'center_y': 0.35}
            font_size : 12
            password : True
        MDFillRoundFlatButton :
            text : "Log in"
            font_size : 12
            size_hint : (0.25,0.05)
            pos_hint : {'center_x' : 0.5,'center_y' : 0.28}
            on_release: root.validate_user()
        MDLabel :
            text : "——————— or ———————"
            font_size : 15
            size_hint : (0.25, 0.05)
            pos_hint : {'center_x': 0.508, 'center_y': 0.23}
            theme_text_color : "Secondary"
        MDFillRoundFlatButton :
            text : "Sign in"
            font_size : 12
            size_hint : (0.25, 0.05)
            pos_hint : {'center_x': 0.5, 'center_y': 0.18}
            on_release: app.root.current = "signin_page"
<MainPage>
    MDScreen:
        MDLabel :
            text : "Our Services :"
            align : "center"
            font_size : 30
            size_hint : (0.5, 0.5)
            pos_hint : {'center_x': 0.5, 'center_y': 0.8}
            theme_text_color : "Secondary"
        MDToolbar:
            title: "Back"
            left_action_items: [["arrow-left",  lambda x: app.change_screen("Login_Page")]]
            pos_hint : {"top":1}
            font_size : 15

        MDFillRoundFlatButton :
            text : "Courier Order and Courier Details"
            font_size : 14
            size_hint : (0.4, 0.09)
            pos_hint : {'center_x': 0.5, 'center_y': 0.6}
            on_release: app.root.current = "c_o_a_details"
        MDFillRoundFlatButton :
            text : "Billings Details"
            font_size : 14
            size_hint : (0.4, 0.09)
            pos_hint : {'center_x': 0.5, 'center_y': 0.4}
            on_release: app.root.current = "billings_table"
        MDFillRoundFlatButton :
            text : "Our Employees"
            font_size : 14
            size_hint : (0.4, 0.09)
            pos_hint : {'center_x': 0.5, 'center_y': 0.2}
            on_release: app.root.current ='employee_table'

ScreenManager:
    id: screen_manager
    transition: NoTransition()

    LoginPage:
        id: login_page
         name: "login_page"

    MainPage:
        id: main_page
         name: "main_page"

    SigninPage:
        id: signin_page
         name: "signin_page"

    BillingsTable:
        id: billings_table
         name: "billings_table"

    EmployeeTable:
        id: employee_table
         name: "employee_table"

    CourierOrderAndDetails:
        id: c_o_a_details
         name: "c_o_a_details"

main.py 文件应该是这样的

class LoginPage(Screen):
    def validate_user(self):
        print(details.keys())
        Username = self.ids.Username.text
        if Username in list(details.keys()):
            if details[Username] == self.ids.Password.text:
                MDApp.get_running_app().switch_screen(main_page)
        else:
            print("not here")

class MainPage(Screen):
    pass

class SigninPage(Screen):
    pass

class BillingsTable(Screen):
    pass

class EmployeeTable(Screen):
    pass

class CourierOrderAndDetails(Screen):
    pass

class MainApp(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.load_kv("welcome.kv")

    def switch_screen(self, screen_name, *args):
        self.root.current = screen_name

如果您注意到了,我已经重构了您的大部分代码。这个想法并不是说你做错了。只是这样的结构会更容易扩展应用程序。

找不到主页屏幕的错误是因为 首先,您创建了一个全新的 screenmanager 对象实例,它与 MainApp class 的构建函数中的对象完全不同,因此没有添加屏幕

此处:self.sm = ScreenManager(transition=NoTransition())

接下来您使用 self.manager.current = "Main_page" 导航到主页屏幕,但 Login_Page 没有属性 self.manager。您创建了 self.sm 但使用了 self.manager

无论如何,这应该可以解决您的问题。