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

Kivy代码报错AttributeError: 'NoneType'对象无text属性求助

解决Kivy中AttributeError: 'NoneType' object has no attribute 'text'的问题

我来帮你搞定这个报错!你遇到的问题核心是你的self.product变量并没有正确关联到KV文件里的输入框控件,它的值一直是None,所以调用.text的时候就触发了AttributeError。

错误原因分析

在你的KV代码里,你给BoxLayout加了product: product这行代码,这其实是给BoxLayout对象本身添加了一个名为product的属性,指向id为product的输入框。但你的Main类里定义的product = ObjectProperty(None)并没有和这个控件绑定起来,所以self.product始终是None,自然访问不了.text属性。

两种解决方法

方法一:直接通过root.ids获取控件(最简单)

不需要额外定义ObjectProperty,直接通过应用根控件的ids字典来访问输入框,这是Kivy里获取控件最常用的方式:

import kivy
from selenium import webdriver
import requests
from selectorlib import Extractor
from selenium.webdriver.common.keys import Keys
from kivymd.app import MDApp
from kivy.lang import Builder

KV = '''
BoxLayout:
    size_hint: .8, .8
    pos_hint: {"center_x": .5, "center_y": .5}
    spacing: dp(100)
    orientation: "vertical"
    MDTextFieldRound:
        id: product
        hint_text: 'Enter a product'
        icon_left: 'magnify'
        on_text_validate: app.System()
'''

class Main(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def System(self):
        # 直接通过根控件的ids字典获取输入框
        print(self.root.ids.product.text)

if __name__ == "__main__":
    Main().run()

方法二:正确绑定ObjectProperty

如果你一定要用ObjectProperty来管理控件,需要在build方法里手动将属性指向输入框:

import kivy
from kivy.properties import ObjectProperty
from selenium import webdriver
import requests
from selectorlib import Extractor
from selenium.webdriver.common.keys import Keys
from kivymd.app import MDApp
from kivy.lang import Builder

KV = '''
BoxLayout:
    size_hint: .8, .8
    pos_hint: {"center_x": .5, "center_y": .5}
    spacing: dp(100)
    orientation: "vertical"
    MDTextFieldRound:
        id: product
        hint_text: 'Enter a product'
        icon_left: 'magnify'
        on_text_validate: app.System()
'''

class Main(MDApp):
    product = ObjectProperty(None)

    def build(self):
        root = Builder.load_string(KV)
        # 将类的product属性绑定到输入框控件
        self.product = root.ids.product
        return root

    def System(self):
        print(self.product.text)

if __name__ == "__main__":
    Main().run()

额外说明

原来KV里的product: product这行代码完全是多余的,它并没有帮你把输入框绑定到Main类的属性上,反而容易造成混淆,所以两种方法里都把这行删掉了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:07:35