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

Python/Kivy循环中仅返回YAML最后一项值的问题排查

问题解决思路

你的问题核心是全局变量checkbox_label在循环中被反复覆盖,循环结束后它只保留最后一项'Reboot'的文本,所以所有复选框的回调函数触发时,都只会操作这个最后值。

修复方案

这里给你两种简单可行的修复方式:

方式一:给CheckBox添加自定义属性存储对应文本

直接在创建CheckBox时,给它绑定对应的功能文本,回调时从CheckBox自身读取:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.checkbox import CheckBox
import yaml

with open('yaml_config.yaml') as file:
    yaml_config = yaml.safe_load(file)

class FeatureLabel(Label):
    pass

class MyLayout(Widget):
    pass

class MyApp(App):
    def __init__(self, **kwargs):
        super(MyApp, self).__init__(**kwargs)
        self.selected_items = []

    def build(self):
        return MyLayout()

    def phase1(self):
        self.root.ids.phase_1.clear_widgets()
        for feature in yaml_config['Phase 1']:
            feature_text = yaml_config['Phase 1'][feature]
            checkbox = CheckBox(active=False)
            # 给checkbox添加自定义属性存储对应文本
            checkbox.feature_text = feature_text
            label = FeatureLabel(text=feature_text)
            checkbox.bind(active=self.on_checkbox_active)
            self.root.ids.phase_1.add_widget(label)
            self.root.ids.phase_1.add_widget(checkbox)

    def on_checkbox_active(self, checkbox, value):
        feature_text = checkbox.feature_text
        if value:
            if feature_text not in self.selected_items:  # 避免重复添加
                self.selected_items.append(feature_text)
                print(self.selected_items)
        else:
            if feature_text in self.selected_items:  # 确保存在再移除
                self.selected_items.remove(feature_text)
                print(self.selected_items)

if __name__ == '__main__':
    MyApp().run()

方式二:用functools.partial绑定参数

通过partial把对应文本作为参数传递给回调函数,避免依赖全局变量:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.checkbox import CheckBox
from functools import partial
import yaml

with open('yaml_config.yaml') as file:
    yaml_config = yaml.safe_load(file)

class FeatureLabel(Label):
    pass

class MyLayout(Widget):
    pass

class MyApp(App):
    def __init__(self, **kwargs):
        super(MyApp, self).__init__(**kwargs)
        self.selected_items = []

    def build(self):
        return MyLayout()

    def phase1(self):
        self.root.ids.phase_1.clear_widgets()
        for feature in yaml_config['Phase 1']:
            feature_text = yaml_config['Phase 1'][feature]
            checkbox = CheckBox(active=False)
            label = FeatureLabel(text=feature_text)
            # 用partial绑定feature_text到回调函数
            checkbox.bind(active=partial(self.on_checkbox_active, feature_text=feature_text))
            self.root.ids.phase_1.add_widget(label)
            self.root.ids.phase_1.add_widget(checkbox)

    def on_checkbox_active(self, checkbox, value, feature_text):
        if value:
            if feature_text not in self.selected_items:
                self.selected_items.append(feature_text)
                print(self.selected_items)
        else:
            if feature_text in self.selected_items:
                self.selected_items.remove(feature_text)
                print(self.selected_items)

if __name__ == '__main__':
    MyApp().run()

额外优化点

  • 添加了存在性判断,避免重复添加或移除不存在的项导致报错
  • 去掉了不必要的全局变量和返回值,代码更简洁

内容的提问来源于stack exchange,提问作者Brandon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:15:13