Kivy使用ScreenManager时启动直接显示游戏页而非登录页问题
问题根因
程序启动直接加载GameWindow、登录页不显示是三个基础逻辑错误导致的:
- 全局位置提前执行
kv = Builder.load_file('box_multiscreen.kv')时,已经根据kv规则生成了一套完整的ScreenManager实例,这个实例默认将最后添加的GameWindow作为初始显示页。 build()方法中手动创建的局部WindowManager实例完全没有被使用:你给这个局部实例加屏、设置current = 'login'的操作全部作用在未挂载到界面的废弃实例上,最后返回的是全局加载kv生成的、默认显示GameWindow的实例。- LoginWindow类中自定义的
name = ObjectProperty(None)和Screen类自带的name属性重名冲突,会导致屏幕名称绑定异常;同时press()方法中直接用类名WindowManager.current做跳转的写法无法获取到运行中的真实ScreenManager实例,后续登录校验通过时也会触发报错。
修复方案
1. 调整.py文件代码
删掉全局加载kv、重复创建ScreenManager的无效逻辑,修正重名属性、跳转引用问题,完整代码如下:
from kivy.app import App from kivy.properties import ObjectProperty from kivy.lang import Builder from kivy.core.window import Window from kivy.uix.screenmanager import ScreenManager, Screen import hashlib Window.size = (512, 512) super_user = "9279F4A7C1C145D5AE930FDA23EF386168F6720B4E0F0D3DEE383C5AD8535737" super_pass = "EE22032527082315A747781829EF1F9195F6AEAC09C0D52DE06EBF9D8C463918" class LoginWindow(Screen): # 重命名自定义属性,避免和Screen自带name属性冲突 username_input = ObjectProperty(None) passw = ObjectProperty(None) def press(self): user_hash = hashlib.sha256(self.username_input.text.encode('utf-8')).hexdigest().upper() pass_hash = hashlib.sha256(self.passw.text.encode('utf-8')).hexdigest().upper() if (user_hash == super_user) and (pass_hash == super_pass): print("Das hat geklappt!") # 通过Screen子类自带的manager属性获取当前运行的屏幕管理器实例做跳转 self.manager.current = 'game' else: print("Du kummst hier net rein!") class GameWindow(Screen): pass class WindowManager(ScreenManager): pass class Affenquiz(App): def build(self): Window.clearcolor = (0.8, 0.8, 0.8, 1) # 直接返回kv加载生成的根组件,无需手动重复添加屏幕 return Builder.load_file('box_multiscreen.kv') if __name__ == "__main__": Affenquiz().run()
2. 调整.kv文件配置
修改LoginWindow的属性绑定,显式指定ScreenManager初始页面,修改对应片段即可,其余布局逻辑保持不变:
WindowManager: current: "login" # 显式指定初始显示登录页 LoginWindow: name: "login" GameWindow: name: "game" <LoginWindow>: username_input: name # 对应py中修改后的属性名 passw: passw # 下方原有BoxLayout、控件、样式代码全部保留,无需改动
验证说明
修改后程序启动会默认加载登录页,输入正确的账号密码校验通过后才会跳转到游戏页面,不会出现直接进游戏界面的问题。
内容的提问来源于stack exchange,提问作者Freakay
相关产品推荐
相关产品推荐

