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

如何在Kivy/KivyMD中实现屏幕切换?现有代码无法生效该如何解决?

问题排查与修复方案

核心错误点

  • current是ScreenManager类的专属属性,你将它写在了MainScreen(继承自Screen)的实例方法中,单个屏幕实例本身没有current属性,调用会触发属性不存在的异常。
  • 你调用MainScreen.switch(self)时传入的self是App实例,并非MainScreen的实例,完全不符合实例方法的调用规则,逻辑完全错误。
  • 你没有正确获取ScreenManager实例,App的root属性对应KV中定义的顶层WindowManager,是控制屏幕切换的入口。

修复方案

方案1:直接通过App的root属性切换(最简洁)

直接修改Python代码中的btn方法即可,无需修改KV文件:

from kivymd.app import MDApp
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.button import MDFloatingBottomButton

class MainScreen(Screen):
    pass

class FileScreen(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class App(MDApp):
    data = {
        'Create': 'file-document',
        'Open': 'folder-open'
    }
    def btn(self, instance):
        print('callback')
        icon = instance.icon
        if isinstance(instance, MDFloatingBottomButton):
            if icon == 'file-document':
                print('Create')
                # 直接通过顶层WindowManager切换屏幕
                self.root.current = "FileScreen"
            elif icon == 'folder-open':
                print('Open')

if __name__ == "__main__":
    App().run()

注意KV文件命名为app.kv,和App类名(去掉App后缀后全小写)对应,否则KV规则不会加载。

方案2:保留原有switch方法的写法

如果你需要保留MainScreen中的switch方法,可以修改为如下实现:

class MainScreen(Screen):
    def switch(self):
        # Screen实例的manager属性自动指向所属的ScreenManager
        self.manager.current = "FileScreen"

对应调用逻辑修改为:

if icon == 'file-document':
    print('Create')
    # 先获取MainScreen实例再调用实例方法
    self.root.get_screen("MainScreen").switch()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 07:24:00