为什么运行Kivy代码哪怕是教程示例代码也会出现报错?
错误原因
- kv文件加载顺序错误:你在
SingnupWindow、LoginWindow等自定义类还没定义的时候,就提前执行了Builder.load_file("main.kv"),Kivy解析kv文件时找不到对应类,直接抛出异常。
- kv文件加载顺序错误:你在
- 窗口类继承错误:Kivy应用全局只能存在一个
App/MDApp实例,你把各个页面窗口都继承了App/MDApp属于逻辑错误,多页面场景下各个页面应该继承Screen类。
- 窗口类继承错误:Kivy应用全局只能存在一个
build方法返回值错误:build方法需要返回应用根控件的实例,你直接返回了MainApp类本身,逻辑完全错误。
- 重复加载kv文件且文件名错误:你已经提前加载了
main.kv,在build方法里又尝试加载名为kv的无后缀文件,属于多余且错误的操作。
- 重复加载kv文件且文件名错误:你已经提前加载了
- 额外检查:确认你的
main.kv里写的类名和Python代码里的拼写完全一致,你代码里写的是SingnupWindow(注意是n在g前面,拼写有误,正确应为Signup),如果kv文件里写的是正确拼写也会触发找不到类的报错。
修复后的代码示例
import kivy from collections import UserList from configparser import ConfigParser from kivy.app import App from kivymd.app import MDApp from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen import kivy.properties as kyprops from kivy.uix.label import Label from kivy.uix.button import Button from kivy.uix.textinput import TextInput from kivy.uix.gridlayout import GridLayout from kivy.storage.jsonstore import JsonStore from os.path import join import requests # 先定义所有自定义类,再加载kv文件 class MainpageWindow(Screen): pass class SingnupWindow(Screen): pass class LoginWindow(Screen): pass # 全局只保留一个App类,这里用MDApp还是App取决于你是否用KivyMD组件 class MainApp(MDApp): def __init__(self,**kwargs): super().__init__(**kwargs) self.title = "Menieres Tracker" # 初始化ScreenManager,管理各个页面 self.sm = ScreenManager() # 把所有页面添加到ScreenManager里 self.sm.add_widget(MainpageWindow(name="mainpage")) self.sm.add_widget(SingnupWindow(name="signup")) self.sm.add_widget(LoginWindow(name="login")) def build(self): # 类定义完成后再加载kv文件 Builder.load_file("main.kv") # 返回根控件ScreenManager的实例 return self.sm if __name__ == '__main__': MainApp().run()
后续检查点
- 确认你的
main.kv文件和Python脚本放在同一目录下 - 确认kv文件里的自定义类名和Python代码里的拼写完全一致,如果你是拼写错误把
Signup写成了Singnup,建议两边都改成正确的拼写避免后续问题 - 先删除代码里多余的
kv = Builder.load_file("main.kv")语句,避免重复加载
内容的提问来源于stack exchange,提问作者Michael Calhoun
相关产品推荐
相关产品推荐

