KivyMD调用remove_widget删除widget时报AttributeError错误如何解决
问题原因
报错AttributeError: 'Game' object has no attribute 'test'是因为KV中定义的id不会直接挂载到App类的实例属性上,所有KV中声明的id都存放在加载KV得到的根组件的ids字典中,你没有给Game类的实例定义test属性,自然无法通过self.test访问到对应组件。
1. 删除KV中定义的组件的方法
直接通过根组件的ids字典获取对应id的组件实例后删除即可,两种写法都可以:
def clears(self): # 写法1:指定父容器删除 self.General.ids.BL.remove_widget(self.General.ids.test) # 写法2:自动获取组件的父容器删除,不用手动指定父容器 # self.General.ids.test.parent.remove_widget(self.General.ids.test)
如果要删除KV中定义的two、three按钮,同理把test替换为对应id即可。
2. 删除动态生成的MDIconButton组件的方法
动态添加组件时,把组件实例存到App的实例属性或列表中,需要删除时取出实例操作即可。
示例1:存储所有动态组件,批量删除
class Game(MDApp): def build(self): self.General = Builder.load_string(KV) self.dynamic_btns = [] # 新增列表存储所有动态生成的按钮 return self.General def hod_igrok(self, igrok, mix, miy,status=None): # 原有逻辑省略... # 创建按钮时存到变量 btn = MDIconButton( pos_hint={"center_x": mix, "center_y": miy}, icon=r"path %s.png"%igrok, user_font_size= '50dp' ) self.General.ids.BL.add_widget(btn) self.dynamic_btns.append(btn) # 存入列表 return self.General # 新增批量删除动态组件的方法 def clear_all_dynamic(self): for btn in self.dynamic_btns: btn.parent.remove_widget(btn) self.dynamic_btns.clear() # 清空列表避免重复删除报错
示例2:动态组件展示指定时间后自动删除
借助kivy.clock实现定时删除:
from kivy.clock import Clock def hod_igrok(self, igrok, mix, miy,status=None): # 原有逻辑省略... btn = MDIconButton( pos_hint={"center_x": mix, "center_y": miy}, icon=r"path %s.png"%igrok, user_font_size= '50dp' ) self.General.ids.BL.add_widget(btn) # 展示3秒后自动删除该按钮 Clock.schedule_once(lambda dt: btn.parent.remove_widget(btn), 3) return self.General
补充说明
如果要清空父容器内的所有组件(包括KV定义的和动态生成的),可以直接调用父容器的clear_widgets方法:
self.General.ids.BL.clear_widgets()
内容的提问来源于stack exchange,提问作者Romero_
相关产品推荐
相关产品推荐

