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

Kivy中remove_widget失效及透明卡片下控件仍可点击问题咨询

Kivy开发问题解决方案

问题1:调用remove_widget时报AttributeError错误

错误原因

  • kv文件中MyCard组件内的关闭按钮调用root.remove_card(),此处root指向MyCard实例,但remove_card()方法定义在HomeScreen类中,MyCard类本身没有该方法,触发属性不存在报错
  • 当前remove_card()的实现逻辑错误:每次执行时会新建一个name为cardd的MyCard实例,而非删除之前已添加到HomeScreen中的实例,即使修复调用路径也无法正常删除组件

修复方案

  1. 调整main.py中HomeScreen的逻辑,存储添加的MyCard实例,保证删除的是已存在的对象:
class HomeScreen(Screen):
    # 存储当前添加的MyCard实例
    current_card = None

    def add_card(self):
        self.current_card = MyCard()
        self.add_widget(self.current_card)
    
    def remove_card(self):
        if self.current_card:
            self.remove_widget(self.current_card)
            self.current_card = None
  1. 调整home.kv中关闭按钮的触发逻辑,调用HomeScreen的方法:
MDIconButton: #-> 关闭按钮
    icon: "close-circle"
    ...
    on_release:
        # 获取上层HomeScreen实例调用删除方法
        app.root.get_screen('home').remove_card()

问题2:半透明遮罩层无法阻挡下层控件交互

错误原因

Kivy的触摸事件默认会向下透传,若上层控件没有消费触摸事件(没有绑定触摸事件并返回True),事件会继续传递给下层控件触发交互。

修复方案

给遮罩层的MDCard添加on_touch_down事件,主动消费所有触摸事件,阻止向下透传:

<MyCard>:
    name: 'cardd'
    MDCard: #-> 遮罩层
        md_bg_color: 0, 0, 0, .3
        # 新增以下行消费触摸事件
        on_touch_down: return True
        ...

额外代码修正

你提供的main.py中ScreenApp的build方法存在嵌套定义错误,修正后:

class ScreenApp(MDApp):
    def build(self):
        sm = ScreenManager(transition=FadeTransition(duration=0.2))
        sm.add_widget(HomeScreen(name='home'))
        sm.add_widget(AVCard(name='av'))
        return sm

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:06:03