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

Kivy中kwargs引发KeyError问题及赛事选择变量存储咨询

问题解决与方案建议

一、KeyError: 'event' 错误修复

KeyError: 'event' 本质是你在访问某个字典(比如self.ids、App的user_data)或者参数时,找不到'event'这个键。结合你调用InitialScreen的press方法时触发,按以下几种常见情况排查修复:

1. 控件ID不匹配

检查kv文件里,你用来选择赛事的控件(比如Spinner、单选按钮组)有没有设置id: event。如果没设,要么给控件加上对应ID,要么修改Python代码里的键名,和kv里的ID保持一致。

比如kv里的赛事选择Spinner:

Spinner:
    id: event_spinner
    values: ['5公里', '10公里', '半马', '全马']

那Python代码里就要用self.ids.event_spinner.text获取选中值,而不是self.ids['event']。

2. 按钮绑定参数错误

如果你的按钮绑定代码写错了参数传递逻辑,也会导致press方法拿不到event值。比如正确的绑定应该是直接把选中的赛事值传进去:

Button:
    text: '确认选择'
    on_press: root.press(self.ids.event_spinner.text)

对应的Python方法要接收这个参数:

def press(self, selected_event):
    # 后续处理选中的赛事
    print(selected_event)

3. 误用App的user_data字典

要是你尝试用App.get_running_app().user_data['event']存储,得先确保这个字典里已经初始化过'event'键,或者先判断再取值:

app = App.get_running_app()
# 先检查键是否存在,不存在就设默认值
if 'event' not in app.user_data:
    app.user_data['event'] = '5公里'
# 再赋值
app.user_data['event'] = selected_event

二、存储用户所选赛事的可行方案

1. 类实例属性临时存储

直接在InitialScreen或者主App类里定义属性,适合单会话内临时存数据,关闭程序就清空:

class InitialScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.selected_event = None  # 初始化存储属性

    def press(self, selected_event):
        self.selected_event = selected_event
        # 切换到计算页面时,把值传过去
        calc_screen = self.manager.get_screen('calculator')
        calc_screen.current_event = self.selected_event

2. 用Kivy自带的user_data持久化存储

Kivy的App类自带user_data字典,会自动保存到本地配置文件,重启程序还能读取:

class PaceCalculatorApp(App):
    def build(self):
        # 初始化默认赛事
        if 'event' not in self.user_data:
            self.user_data['event'] = '5公里'
        return Builder.load_file('your_kv_file.kv')

# 在InitialScreen的press方法里赋值
def press(self, selected_event):
    App.get_running_app().user_data['event'] = selected_event

3. 本地JSON文件存储

如果需要更灵活的存储(比如保存多个用户设置),可以用JSON文件读写:

import json
import os

# 保存赛事到本地文件
def save_selected_event(event):
    data = {'selected_event': event}
    with open('event_settings.json', 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

# 读取本地存储的赛事
def load_selected_event():
    if os.path.exists('event_settings.json'):
        with open('event_settings.json', 'r', encoding='utf-8') as f:
            data = json.load(f)
            return data.get('selected_event', '5公里')
    return '5公里'

# 在press方法里调用
def press(self, selected_event):
    save_selected_event(selected_event)

4. Kivy Properties跨组件同步

用Kivy的属性系统,让赛事选择值变化时自动同步到其他组件,适合跨页面传递数据:

from kivy.properties import StringProperty

class InitialScreen(Screen):
    selected_event = StringProperty('5公里')  # 定义可观察属性

    def press(self):
        # 直接给属性赋值
        self.selected_event = self.ids.event_spinner.text

# 在kv文件里可以直接绑定这个属性到其他页面
<CalculatorScreen>:
    Label:
        text: f"当前赛事:{root.manager.get_screen('initial').selected_event}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:47:31