Kivy/Kivymd中ExpansionPanel内卡片切换屏幕设置过渡方向报错求助
问题根因
- 报错的核心原因是:
MyContentComunes作为嵌套在ExpansionPanel内部的自定义组件,root关键字在该组件的作用域内指向的是MyContentComunes实例本身,而非你当前所在的Screen实例,自然不存在manager/screen属性,无法直接调用ScreenManager的方法。
可行解决方案
方案1:在kv语言中遍历父组件获取Screen实例
在ElementCard的on_release事件中,不要直接用root.manager,改成向上遍历父组件找到Screen实例后再调用切换逻辑:
# 原来的错误写法 # on_release: root.manager.transition.direction = "left"; root.manager.current = "目标屏幕名" # 修改后的写法 on_release: # 向上遍历拿到当前所在的Screen实例 screen = self while not hasattr(screen, 'manager'): screen = screen.parent screen.manager.transition.direction = "left" screen.manager.current = "你要切换到的屏幕名称"
方案2:在py代码中绑定事件实现切换
如果逻辑写在py文件中,可以给MyContentComunes类添加专用的屏幕切换方法:
from kivy.uix.boxlayout import BoxLayout class MyContentComunes(BoxLayout): def switch_screen(self, target_screen): # 遍历父组件获取Screen实例 screen = self while not hasattr(screen, 'manager'): screen = screen.parent screen.manager.transition.direction = "left" screen.manager.current = target_screen
之后在kv中绑定事件即可:
ElementCard: on_release: root.switch_screen("目标屏幕名")
方案3:通过App全局实例获取ScreenManager(最简便)
如果你的ScreenManager是App的根组件,可直接通过App实例调用,无需遍历父级:
on_release: app.root.transition.direction = "left" app.root.current = "目标屏幕名"
内容的提问来源于stack exchange,提问作者Drovosek
相关产品推荐
相关产品推荐

