上面我们说到了 LVGL 采用父子对象模型:所有 UI 元素都是 lv.obj 的子类,通过父子关系构建界面层级(屏幕 → 按钮 → 标签),这是新手最容易混淆的两个「父子 / 子类」概念。
首先要明确:LVGL 里的「父子对象模型」和 Python 类的「继承(子类)」是完全不同维度的设计,对应 OOP(面向对象)的两个核心关系:

所谓「生成不同控件的实例」,正是 LVGL 的 has-a 组合逻辑;而 Python 类继承是 is-a 的类型扩展逻辑 ——LVGL 并没有抛弃继承(控件类型本身是继承 lv.obj 的),但界面组织的核心是「组合(父子实例)」而非「继承(子类)」。
对于嵌入式 GUI 来说,其核心需求是空间层级管理,LCD屏幕是二维平面,控件需要有空间归属和覆盖关系:
- 标签必须 “贴” 在按钮上,按钮必须 “放在” 屏幕上;
- 渲染时要按「父 → 子」顺序绘制(先画屏幕,再画按钮,最后画标签,标签才会覆盖按钮);
- 隐藏 / 移动父控件时,子控件要跟着一起隐藏 / 移动(比如把按钮移到屏幕右侧,按钮上的标签也要跟着走)。
并且,控件之间的生命周期具有约束关系:销毁父控件时会自动销毁所有子控件(比如关闭窗口时,窗口里的按钮、标签一起释放),避免内存泄漏。
同时 GUI 的交互(点击、滑动、长按)需要「事件冒泡」:
- 比如你点击按钮上的标签,事件会先传给标签,再传给按钮,最后传给屏幕;
- 这种实例间的事件传递,只能通过父子层级实现 —— 继承是类型关系,两个
LabeledButton实例之间没有任何关联,无法传递事件。

