如何在Kivy中通过Popup弹窗运行CheckBox组件并解决集成报错
错误原因
Popup的content参数仅接受Widget子类的实例作为输入,你在onButtonPress3方法中直接传入了CheckBoxesApp类的实例,而CheckBoxesApp继承自App并非Widget子类,因此触发了WidgetException类型校验错误。同时单进程内运行多个Kivy应用实例本身就是不推荐的用法,你可以直接复用已经封装好的Checkboxes组件,不需要额外套一层App。
修改步骤
- 调整
Checkboxes类中FINISH选项的逻辑,删除关闭全局应用的代码,改为关闭当前弹窗 - 修改
onButtonPress3方法,直接实例化Checkboxes组件传入Popup即可
关键代码修改
修改Checkboxes类的checkboxes_click方法
def checkboxes_click(self, instance, value, text): if value: print(f"Select {text}") self.myvar = FruitsSellected #Close if text == 'FINISH': print(FruitsSellected) self.save() # 新增:关闭当前弹窗,不要停止整个主应用 if hasattr(self, 'popup_ref'): self.popup_ref.dismiss() return FruitsSellected FruitsSellected.append(str(text)) else: print(f"UnSelect {text}") FruitsSellected.remove(str(text))
修改onButtonPress3方法
def onButtonPress3(self, button): # 直接使用封装好的Checkboxes组件,不需要实例化App checkboxes_widget = Checkboxes() # 可以按需调整弹窗大小 popup3 = Popup(title='SELECT', content=checkboxes_widget, size_hint=(0.8, 0.8)) # 将弹窗实例传给组件,方便点FINISH时关闭 checkboxes_widget.popup_ref = popup3 popup3.open()
如果需要保留CheckBoxesApp单独运行的能力可以继续保留,不影响主程序逻辑;如果不需要单独启动复选框页面,可以直接删除CheckBoxesApp类的定义。
内容的提问来源于stack exchange,提问作者nAbscissa
相关产品推荐
相关产品推荐

