You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kivy的.py文件中实现屏幕间Checkbox值传递?

Kivy屏幕间传递Checkbox状态的问题解决

错误原因

你遇到的AttributeError源于两个核心问题:

  1. model_inference是ModelsettingsScreen类的方法,并非实例属性,你试图访问.model_inference.pick_cloth相当于给函数对象查找不存在的属性,必然报错。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:02:14