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
无论如何,这应该可以解决您的问题。
现在我已经使用 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
无论如何,这应该可以解决您的问题。