Kivy调用home_switch报错不存在名为home的screen如何解决
问题根本原因
你代码里存在两个完全独立的WindowManager实例:
- 你在全局作用域手动创建了
sm = WindowManager(),这个实例从未添加过任何Screen,没有叫home的页面是必然的 - 你在
build方法里通过Builder.load_file('Vocate.kv')又生成了一个全新的WindowManager实例,这个实例才是真正包含了start、sign up、log in、home四个Screen的有效实例,也是你App实际渲染的根控件
你在Sign_Up.signup方法里调用的是全局无效的sm实例的方法,自然会报错找不到home页面。
修复方案
做两处简单修改即可:
- 删除全局无用的
sm = WindowManager()这行代码 - 修改
Sign_Up.signup方法里的切换逻辑,通过Screen自带的manager属性获取它所属的有效WindowManager实例,再调用切换方法
修改后的Python代码片段
class Sign_Up(Screen): def signup(self): signup_password = self.signup_password.text signup_password_re = self.signup_password_re.text if signup_password != "" and signup_password_re != "": if signup_password == signup_password_re: print ("correct") # 把原有的sm.home_switch()改成下面这行 self.manager.home_switch() else: print ("incorrect") else: print ("empty") # 全局的这行代码直接删除即可 # sm = WindowManager()
补充说明
你之前尝试的操作失效原因:
- 删除kv里的
WindowManager:后,Builder加载kv只会注册各个Screen的样式规则,不会创建实际的ScreenManager实例和添加子Screen,build方法返回空,自然显示空白 - 移除Builder加载逻辑、重命名kv为同名文件后失效,是因为MDApp的自动加载kv规则要求App类名去掉App后缀后和kv文件名匹配,你的App类是
MainApp,对应的kv文件名应该是main.kv(全小写),而且要保证build方法没有自定义返回值才会触发自动加载。
内容的提问来源于stack exchange,提问作者Biscuit
相关产品推荐
相关产品推荐

