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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:15:02