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

Kivy中ObjectProperty返回None而非预期TextInput实例,是哪里配置有误?

问题根因

Kivy框架中kv文件定义的属性绑定逻辑,是在控件类的__init__方法完全执行完成后才会触发的。你在TextEntryDropDown的__init__方法中直接将self.user_choice传入DropDownList的构造函数时,kv还未完成user_choice和TextInput实例的绑定,此时user_choice还是初始默认值None,后续on_select方法访问self.user_choice.text时自然会抛出空属性异常。

修复方案

将下拉控件的初始化逻辑延迟到kv属性绑定完成后执行即可,最简单的实现方式是用Kivy内置的Clock.schedule_once将初始化逻辑调度到下一帧执行:

  1. 首先引入Clock模块:
from kivy.clock import Clock
  1. 修改TextEntryDropDown类的实现,把下拉初始化逻辑抽为单独方法并延迟调用:
class TextEntryDropDown(BoxLayout):
    user_choice = ObjectProperty(None)
    drop_button = ObjectProperty(None)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 延迟到下一帧执行,此时kv属性已完成绑定
        Clock.schedule_once(self.init_dropdown, 0)

    def init_dropdown(self, dt):
        self.dropdown = DropDownList(self.user_choice)
        for item in ['Option 1', 'Option 2', 'Option 3']:
            label = DropDownItem(self.dropdown, text=item, size_hint_y=None, height=30)
            self.dropdown.add_widget(label)

修改后重新运行代码即可正常实现下拉选择赋值逻辑。

额外注意事项

需确认kv文件命名符合Kivy规则:你的App类名为MyApp,kv文件名必须为全小写的my.kv,且放在和main.py同级的目录下,否则kv规则不会生效也会导致属性绑定失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:36:05