如何在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
相关产品推荐
相关产品推荐

