You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy不使用KV语言 通过Python代码控制屏幕切换 弹窗触发失效

问题根源

你遇到的问题由两个核心错误导致:

  • ScreenManager实例误用:你在change_screen方法中重新创建了一个全新的ScreenManager对象,这个对象完全独立,没有被添加到App的渲染树中,你修改它的current属性不会作用于当前界面上正在显示的、在KV中提前实例化的根WindowManager。这也是你终端打印sm.current显示为second但界面完全没有变化的核心原因。
  • MainWindow实例误用:你在Pow类中直接通过mainw=MainWindow()创建了一个全新的MainWindow实例,这个实例和当前界面上正在显示的MainWindow没有任何关联,调用这个后台实例的change_screen方法自然不会触发实际界面的切换。
修复方案

只需要修改Python代码部分即可,KV代码不需要调整:

  1. 修正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)
  1. 调整弹窗逻辑,把当前激活的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)
  1. 修正Pow类的mainw定义,不要主动实例化MainWindow:
class Pow(FloatLayout):
    mainw = None

注意:你的KV代码中已经提前在根WindowManager中注册了名为second的SecondWindow实例,不需要在change_screen中重复调用add_widget添加页面,否则会出现重复页面的问题。

内容的提问来源于stack exchange,提问作者mark diev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:36:03