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

Kivy kv文件Invalid data after declaration报错求助

Kivy语法报错:Invalid data after declaration 解决提示

问题现象

按照两年前的Kivy教程编写代码后,运行时触发ParserException,报错指向kv文件中属性绑定的行:

kivy.lang.parser.ParserException: Parser: File "C:\Users\User\PycharmProjects\Data_Science\my.kv", line 2:
 ...
       1:<MyGridLayout>
 >>    2:     Name:Name
       3:     Profession:Profession
       4:     Year_of_Experience:Year_of_Experience
 ...
 Invalid data after declaration

原因分析

Kivy新版本对kv语言的语法校验更严格,大写开头的属性名称会被解析为类级别的静态属性,而非实例属性,导致绑定语法不合法。同时这种命名也不符合Python的PEP8命名规范(实例属性应小写开头)。

解决步骤

  1. 修改Python代码中的属性命名
    将类中大写开头的属性改为小写开头,同步更新press方法内的引用:
import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty

class MyGridLayout(Widget):
    # 改为小写开头的实例属性名
    name = ObjectProperty(None)
    profession = ObjectProperty(None)
    year_of_experience = ObjectProperty(None)
    
    def press(self):
        name = self.name.text
        profession = self.profession.text
        year_of_experience = self.year_of_experience.text
        
        # 取消注释可展示输入结果
        # self.add_widget(Label(text=f'Hello {name}, your profession is {profession} and you have {year_of_experience} years of experience', font_size=20))
        
        # 清空输入框
        self.name.text = ""
        self.profession.text = ""
        self.year_of_experience.text = ""

class MyApp(App):
    def build(self):
        return MyGridLayout()

if __name__ == "__main__":
    MyApp().run()
  1. 修改kv文件中的属性绑定
    将kv文件中对应属性的绑定改为小写开头,匹配Python代码中的属性名:
<MyGridLayout>
    # 绑定小写开头的实例属性
    name: Name
    profession: Profession
    year_of_experience: Year_of_Experience
    
    GridLayout:
        cols: 1
        size: root.width, root.height
        
        GridLayout:
            cols: 2
            
            Label:
                text: "Name"
            TextInput:
                id: Name
                multiline: False
                
            Label:
                text: "Profession"
            TextInput:
                id: Profession
                multiline: False
                
            Label:
                text: "Year of Experience"
            TextInput:
                id: Year_of_Experience
                multiline: False
                
        Button:
            text: "Submit"
            font_size: 32
            on_press: root.press()

验证结果

修改后运行代码,即可正常加载界面,点击Submit按钮能清空输入框,注释的结果展示代码也能正常执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:35:37