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中的实例,即使修复调用路径也无法正常删除组件
修复方案
- 调整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
- 调整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
相关产品推荐
相关产品推荐

