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命名规范(实例属性应小写开头)。
解决步骤
- 修改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()
- 修改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
相关产品推荐
相关产品推荐

