Kivy不使用KV语言 通过Python代码控制屏幕切换 弹窗触发失效
问题根源
你遇到的问题由两个核心错误导致:
- ScreenManager实例误用:你在
change_screen方法中重新创建了一个全新的ScreenManager对象,这个对象完全独立,没有被添加到App的渲染树中,你修改它的current属性不会作用于当前界面上正在显示的、在KV中提前实例化的根WindowManager。这也是你终端打印sm.current显示为second但界面完全没有变化的核心原因。 - MainWindow实例误用:你在
Pow类中直接通过mainw=MainWindow()创建了一个全新的MainWindow实例,这个实例和当前界面上正在显示的MainWindow没有任何关联,调用这个后台实例的change_screen方法自然不会触发实际界面的切换。
修复方案
只需要修改Python代码部分即可,KV代码不需要调整:
- 修正
change_screen方法,不要新建ScreenManager,直接使用当前Screen自带的manager属性(该属性指向真实管理当前页面的ScreenManager实例):
def change_screen(self): print("c_S") # 直接调用已有的ScreenManager切换页面 self.manager.current = 'second' print(self.manager) print(self.manager.current)
- 调整弹窗逻辑,把当前激活的MainWindow实例传给弹窗的Pow对象:
首先修改show_popupw函数,增加参数接收MainWindow实例:
def show_popupw(main_window): show = Pow() # 传入真实的MainWindow实例 show.mainw = main_window popupWindow = Popup(title="Popup Window", content=show, size_hint=(None,None),size=(400,400)) popupWindow.open()
然后修改MainWindow的set方法,调用弹窗时传入自身实例:
def set(self): x=9 y=8 print(x,y) show_popupw(self)
- 修正Pow类的
mainw定义,不要主动实例化MainWindow:
class Pow(FloatLayout): mainw = None
注意:你的KV代码中已经提前在根WindowManager中注册了名为second的SecondWindow实例,不需要在change_screen中重复调用add_widget添加页面,否则会出现重复页面的问题。
内容的提问来源于stack exchange,提问作者mark diev
相关产品推荐
相关产品推荐

