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

KivyMD中MD3Card调用屏幕切换函数报错的解决求助

解决KivyMD中点击MD3Card切换屏幕的问题

问题根源分析

  • 第一种报错:MD3Card的root指向组件自身,而非父级的AllGimScreen,因此调用root.cards_activities()会找不到对应方法。
  • 第二种报错:MD3Card属于独立组件,ids只能访问自身或直接子组件的标识,无法跨层级获取ScreenManager的实例。

正确实现方案

方案1:通过App实例直接操作ScreenManager

这是最简洁的实现方式,利用全局App实例获取ScreenManager后切换页面。

Python代码:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.card import MD3Card

class AllGimScreen(Screen):
    pass

class GimPageScreen(Screen):
    pass

class MyApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(AllGimScreen(name='all_gim'))
        sm.add_widget(GimPageScreen(name='gim_page'))
        return sm

if __name__ == '__main__':
    MyApp().run()

KV文件:

<AllGimScreen>:
    MD3Card:
        on_release: app.root.current = 'gim_page'
        size_hint: .8, .2
        pos_hint: {'center_x': .5, 'center_y': .5}
        MDLabel:
            text: "点击切换到gim_page"
            halign: 'center'

<GimPageScreen>:
    MDLabel:
        text: "这是gim_page页面"
        halign: 'center'

方案2:通过父容器层级查找ScreenManager

若不想依赖全局App实例,可通过组件的parent属性逐层向上定位到Screen,再获取其关联的ScreenManager。

修改KV文件:

<AllGimScreen>:
    MD3Card:
        on_release: 
            screen = self.parent
            screen.manager.current = 'gim_page'

方案3:自定义事件传递(适合复杂业务场景)

如果需要在切换页面前后执行额外逻辑,可给MD3Card定义自定义事件,由父级Screen处理事件并完成页面切换。

Python代码:

from kivy.event import EventDispatcher
from kivymd.uix.card import MD3Card
from kivy.uix.screenmanager import Screen

class CustomMD3Card(MD3Card, EventDispatcher):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.register_event_type('on_card_click')

    def on_release(self):
        self.dispatch('on_card_click')

class AllGimScreen(Screen):
    def handle_card_click(self, card):
        # 可在此添加切换前的逻辑,比如参数传递
        self.manager.current = 'gim_page'

KV文件:

<AllGimScreen>:
    CustomMD3Card:
        on_card_click: root.handle_card_click(self)
        size_hint: .8, .2
        pos_hint: {'center_x': .5, 'center_y': .5}
        MDLabel:
            text: "点击切换到gim_page"
            halign: 'center'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:13:30