如何在Kivy的.py文件中实现屏幕间Checkbox值传递?
Kivy屏幕间传递Checkbox状态的问题解决
错误原因
你遇到的AttributeError源于两个核心问题:
model_inference是ModelsettingsScreen类的方法,并非实例属性,你试图访问.model_inference.pick_cloth相当于给函数对象查找不存在的属性,必然报错。pick_cloth是model_inference方法内部的局部变量,方法执行结束后该变量会被销毁,外部无法访问。
解决方案1:将状态设为屏幕实例属性(推荐,符合类封装逻辑)
修改ModelsettingsScreen,把pick_cloth定义为实例属性,赋值后其他屏幕可通过屏幕实例直接访问:
class ModelsettingsScreen(Screen): def SwitchScreen(self,destination:str): self.manager.current = destination def __init__(self, **kwargs): super().__init__(**kwargs) # 初始化实例属性,默认值与Checkbox保持一致 self.pick_cloth = False def model_inference(self, stop_event, start_time): if stop_event.is_set(): return # 将局部变量改为实例属性赋值 self.pick_cloth = self.ids.cloth_pick.active print("pick_cloth = ", self.pick_cloth ) class ResultScreen(Screen): def SwitchScreen(self,destination:str): self.manager.current = destination def create_list_results(self,results): # 直接访问屏幕实例的pick_cloth属性 models_screen = self.manager.get_screen('ModelsettingsScreen') print(models_screen.pick_cloth)
解决方案2:直接读取Checkbox的实时状态(最直接,无需额外存储)
如果需要获取Checkbox的最新状态,可跳过中间变量,直接从屏幕的ids中读取:
class ResultScreen(Screen): def create_list_results(self,results): models_screen = self.manager.get_screen('ModelsettingsScreen') # 直接访问Checkbox的active属性 print(models_screen.ids.cloth_pick.active)
解决方案3:用App实例存储全局状态(适合多屏幕共享多个数据的场景)
将状态存储在MDApp子类实例中,所有屏幕都可通过app访问:
class App(MDApp): def __init__(self, **kwargs): super().__init__(**kwargs) self.filemanager = MDFileManager(select_path=self.select_path,exit_manager=self.exit_manager,preview=True) # 初始化全局状态变量 self.pick_cloth = False # 修改ModelsettingsScreen的model_inference方法 class ModelsettingsScreen(Screen): def model_inference(self, stop_event, start_time): if stop_event.is_set(): return pick_cloth = self.ids.cloth_pick.active # 将值存入App实例 App.get_running_app().pick_cloth = pick_cloth print("pick_cloth = ", pick_cloth ) # 在ResultScreen中读取全局状态 class ResultScreen(Screen): def create_list_results(self,results): print(App.get_running_app().pick_cloth)
小优化:给Checkbox设置默认状态
你的kv文件中Checkbox的active字段为空,建议设置默认值避免初始状态不确定:
<ModelsettingsScreen>: BoxLayout: orientation: 'vertical' MDTopAppBar: title: "Model setting" md_bg_color: app.theme_cls.primary_dark BoxLayout: CheckBox: group:'check' active: False # 添加默认选中状态 id: cloth_pick color:0,0,0,1
内容的提问来源于stack exchange,提问作者Calla
相关产品推荐
相关产品推荐

