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将初始化逻辑调度到下一帧执行:
- 首先引入Clock模块:
from kivy.clock import Clock
- 修改
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
相关产品推荐
相关产品推荐

