
Kivy 报错 FactoryException: Unknown class 通常并非因类名不一致,而是因自定义类未正确继承 Kivy 内置可实例化 UI 类(如 Widget、Screen、RecycleView 等),或 KV 中使用了错误的语法(如误用行为类 RecycleDataViewBehavior 作为根节点)。
kivy 报错 `factoryexception: unknown class
在 Kivy 中,KV 文件中以 <classname>:</classname> 定义的规则,要求该 ClassName 必须是 已注册到 Kivy Factory 的、可直接实例化的 UI 类。这包括所有继承自 kivy.uix.widget.Widget 及其子类(如 Screen、BoxLayout、RecycleView)的自定义类——但不包括仅提供行为(behavior)的抽象基类,例如 RecycleDataViewBehavior、FocusBehavior 或 DragBehavior。
你遇到的错误:
kivy.factory.FactoryException: Unknown class <ShowCurrentMeds>
根本原因在于 KV 文件中这样定义:
<ShowCurrentMeds>:
name: 'ShowCurrentMeds'
RecycleDataViewBehavior: ← ❌ 错误:这不是一个可实例化的组件!RecycleDataViewBehavior 是一个混入式行为类(mixin),用于增强 已有视图项(如 RecycleView 的 viewclass 中的单个 item),它本身不能作为 KV 规则的根节点,也不会被自动注册进 Factory。因此 Kivy 在解析 <showcurrentmeds></showcurrentmeds> 时找不到对应的有效类,抛出 Unknown class 异常。
✅ 正确做法是:确保 Python 类继承自一个合法的 UI 容器类(如 Screen、BoxLayout 或 RecycleView),并在 KV 中使用标准类定义语法(非 @ 语法)或显式模板语法(@)配合正确基类。
例如,若你的意图是创建一个可导航的屏幕页面,应改为:
Python 端(修正继承):
from kivy.uix.screenmanager import Screen
class ShowCurrentMeds(Screen): # ✅ 继承自 Screen(可实例化、已注册)
def currentmeds(self, meds):
# ...(原有逻辑保持不变,但注意:方法调用需通过实例,见下方说明)
passKV 端(标准规则):
<ShowCurrentMeds>:
name: 'ShowCurrentMeds'
# 可在此添加布局结构,如 ScrollView + GridLayout 等
BoxLayout:
orientation: 'vertical'
# 示例占位内容
Label:
text: 'Current Medications'⚠️ 注意事项:
-
RecycleDataViewBehavior应仅用于定义RecycleView.viewclass中的单个数据项组件(如MedItem),而非整个页面。若你实际需要的是一个带回收机制的列表容器,请使用RecycleView作为主容器,并另建一个MedItem(RecycleDataViewBehavior)类作为viewclass。 - 方法调用需通过实例:你原代码中
ShowCurrentMeds.currentmeds(meds)是静态调用,但currentmeds并非@staticmethod;应通过实例调用,例如:# 在 MedsPage.med_enter() 中: screen = self.manager.get_screen('ShowCurrentMeds') screen.currentmeds(meds) - 若你确实想用模板语法快速定义轻量视图,可使用
@符号(此时不需 Python 类):<ShowCurrentMed@Screen>: name: 'ShowCurrentMeds' # KV 内容...但此时 Python 中无需定义
ShowCurrentMed类,Kivy 会动态生成。
? 总结:Unknown class <x></x> 的核心排查路径是——
1️⃣ 检查 Python 中是否存在名为 X 的类;
2️⃣ 确认该类是否继承自 Widget 或其子类(如 Screen, BoxLayout, RecycleView);
3️⃣ 确保 KV 中未将行为类(*Behavior)误作根节点;
4️⃣ 验证类定义在 KV 加载之前已导入并执行(推荐将所有自定义类置于 App.build() 之前或 __init__.py 中统一导入)。
遵循以上原则,即可彻底避免此类 Factory 注册失败问题。

















