Kivy组件层级行为异常:按钮切换屏幕仅单个生效求助
问题原因与解决方案
你的问题出在KV语言的语法错误上:前两个按钮的on_press回调里用了冒号:进行赋值,而Kivy的事件处理代码块中,赋值必须使用等号=。
具体问题点
看这两个按钮的代码:
Button: text: "placeholder" font_size: 32 on_press: app.root.current: "courseprogress" # 这里用了冒号,错误 root.manager.transition.direction: "left" # 同样错误
在KV语言中,:是用来定义组件属性的语法(比如text: "placeholder"),但在on_press这类事件的代码块里,执行赋值操作必须用=,否则Kivy不会将其识别为有效的赋值动作,自然不会触发屏幕切换。
第三个按钮用了=,所以能正常工作:
Button: text: "Next Screen" font_size: 32 on_press: app.root.current = "courseprogress" # 等号,正确 root.manager.transition.direction = "left" # 等号,正确
修正后的代码
把前两个按钮的on_press代码改成等号赋值即可:
GridLayout: name: "bottomGrid" cols: 2 Button: text: "placeholder" font_size: 32 on_press: app.root.current = "courseprogress" root.manager.transition.direction = "left" Button: text: "placeholder2" font_size: 32 on_press: app.root.current = "courseprogress" root.manager.transition.direction = "left"
补充说明
你对app.root的理解是对的——它确实指向应用的根组件(这里就是WindowManager),是全局有效的;root.manager则是当前屏幕(CourseGridLayout)所属的ScreenManager,两者在这个场景下效果一致,只是你的语法错误导致前两个按钮的逻辑没执行。
内容的提问来源于stack exchange,提问作者Arana
相关产品推荐
相关产品推荐

