Kivy中如何清除ModelSpecifications组件避免Spinner选择后按钮重复添加
解决方案
问题根因
- 你在
ModelSpecifications的类kv规则中定义的id:anss无法被MainWidget的ids访问:id仅在同一个父组件的kv实例规则范围内生效,类规则的id不属于任何实例的ids集合,因此self.ids["anss"]会报错找不到组件 - 你之前尝试调用
ModelSpecifications.clear_widgets(ModelSpecifications)是错误用法:clear_widgets是实例方法,必须作用在已经创建的ModelSpecifications实例上,不能直接作用在类本身 - 每次Spinner触发选中事件时你都新建了一个
ModelSpecifications实例添加到scd中,旧的实例没有被移除,因此会出现按钮持续累加的问题
修改方法(对原代码改动最小)
只需修改MainWidget类中的btn10方法,在添加新的ModelSpecifications实例前,先移除已存在的旧实例即可:
def btn10(self,text): # 先清除已存在的ModelSpecifications实例 for widget in self.ids.scd.children: if isinstance(widget, ModelSpecifications): self.ids.scd.remove_widget(widget) # 后续新增按钮的逻辑保持不变 self.cal5 = ModelSpecifications() a=data2 b=data3 c=data4 mi=[] n=0 while n < len(a): aba=(str(a[n])+"\n"+str(b[n])+"\n"+str(c[n])) mi.append(aba) n+=1 for i in mi: self.b1=Button(text=str(i),size_hint=(1,None),height="100dp") self.cal5.add_widget(self.b1) self.ids.scd.add_widget(self.cal5, index=3)
可选优化方案
你也可以只创建一次ModelSpecifications实例,后续每次选中Spinner时直接清空实例内的按钮再新增,不用反复创建销毁实例,性能更好:
class MainWidget(Widget): an0=tuple(list(OrderedDict.fromkeys(data1))) cal5= ObjectProperty(ModelSpecifications()) # 提前创建唯一实例 def on_kv_post(self, base_widget): # kv规则加载完成后将实例添加到布局中 self.ids.scd.add_widget(self.cal5, index=3) def btn10(self,text): # 直接清空当前实例内的所有按钮 self.cal5.clear_widgets() # 后续新增按钮逻辑不变,无需重复创建实例、重复添加到布局 a=data2 b=data3 c=data4 mi=[] n=0 while n < len(a): aba=(str(a[n])+"\n"+str(b[n])+"\n"+str(c[n])) mi.append(aba) n+=1 for i in mi: self.b1=Button(text=str(i),size_hint=(1,None),height="100dp") self.cal5.add_widget(self.b1)
内容的提问来源于stack exchange,提问作者Batuhan Karakaya
相关产品推荐
相关产品推荐

