试用 LVGL Pro,一套完整的工具包,助您高效构建、测试、分享和交付 UI!
LVGL
案例展示

PikaScript:面向微控制器的轻量级 Python 与 LVGL

在仅需 32 KB 闪存和 4 KB 内存的微控制器上运行 Python。PikaScript 带来 LVGL8 支持,具备 MicroPython 兼容的 API 和智能 C 绑定。

Lyon LisboaLyon Lisboa6 分钟阅读

什么是 PikaScript?#

PikaScript 是专为微控制器设计的 Python 解释器,支持 Python 3 常用语法的子集。

它更轻量,仅需 32 KB 的代码空间和 4 KB 的内存,这意味着它可以在 STM32F103C8(蓝色药丸)甚至 STM32G030C8 上运行。这为更多功能或更大的缓冲区留下了宝贵的空间。

它更简单,开箱即用,无需任何移植和配置。它不依赖操作系统或文件系统,并且对 Keil、IAR 和 RT-Thread Studio 等流行的 Windows IDE 有良好的支持。当然,它也支持 Linux GCC 开发平台。

它更智能,具有独特的 C 模块机制,允许您只需用 Python 编写 C 模块的 API 即可自动生成绑定。您无需手动编写任何宏或全局表。另一方面,所有 C 模块都具有精细的智能提示,甚至可以提示参数的类型。

PikaScript 是 GitHub 上的开源项目:https://github.com/pikasTech/pikascript


为什么选择 PikaScript + LVGL?#

PikaScript 现在支持 LVGL8 的主要功能,并且这些 API 与 MicroPython 完全兼容。

这意味着您可以继续使用已经编写好的 MicroPython 代码,同时使用更少的代码空间和内存。

环形动画演示的峰值内存占用仅为 6.56 KB:

显示 6.56 KB 峰值的内存使用情况
显示 6.56 KB 峰值的内存使用情况

享受详细的代码提示,包括参数类型,以获得更好的编程体验:

代码编辑器显示智能参数提示
代码编辑器显示智能参数提示

使用更方便的 IDE,例如基于 VS 的模拟项目:

Visual Studio 模拟项目
Visual Studio 模拟项目

LVGL 示例#

以下是 PikaScript 已经可以运行的一些 LVGL 示例。它们主要来自 LVGL 文档示例。

弧形控件#

import pika_lvgl as lv
import PikaStdLib
mem = PikaStdLib.MemChecker()
 
# 创建一个弧形
arc = lv.arc(lv.scr_act())
arc.set_end_angle(200)
arc.set_size(150, 150)
arc.center()
 
print('mem used max: %0.2f kB' % (mem.getMax()))
print('mem used now: %0.2f kB' % (mem.getNow()))
python
LVGL 弧形控件演示
LVGL 弧形控件演示

进度条控件#

import pika_lvgl as lv
import PikaStdLib
mem = PikaStdLib.MemChecker()
 
bar1 = lv.bar(lv.scr_act())
bar1.set_size(200, 20)
bar1.center()
bar1.set_value(70, lv.ANIM.OFF)
 
print('mem used max: %0.2f kB' % (mem.getMax()))
print('mem used now: %0.2f kB' % (mem.getNow()))
python
LVGL 进度条控件演示
LVGL 进度条控件演示

按钮控件#

import pika_lvgl as lv
import PikaStdLib
mem = PikaStdLib.MemChecker()
 
 
def event_cb_1(evt):
    print('in evt1')
    print('mem used now: %0.2f kB' % (mem.getNow()))
 
 
def event_cb_2(evt):
    print('in evt2')
    print('mem used now: %0.2f kB' % (mem.getNow()))
 
 
btn1 = lv.btn(lv.scr_act())
btn1.align(lv.ALIGN.TOP_MID, 0, 10)
btn2 = lv.btn(lv.scr_act())
btn2.align(lv.ALIGN.TOP_MID, 0, 50)
btn1.add_event_cb(event_cb_1, lv.EVENT.CLICKED, 0)
btn2.add_event_cb(event_cb_2, lv.EVENT.CLICKED, 0)
 
print('mem used max: %0.2f kB' % (mem.getMax()))
print('mem used now: %0.2f kB' % (mem.getNow()))
python
LVGL 按钮控件演示
LVGL 按钮控件演示

复选框控件#

import pika_lvgl as lv
import PikaStdLib
mem = PikaStdLib.MemChecker()
 
cb = lv.checkbox(lv.scr_act())
cb.set_text("Apple")
cb.align(lv.ALIGN.TOP_LEFT, 0 ,0)
 
cb = lv.checkbox(lv.scr_act())
cb.set_text("Banana")
cb.add_state(lv.STATE.CHECKED)
cb.align(lv.ALIGN.TOP_LEFT, 0 ,30)
 
cb = lv.checkbox(lv.scr_act())
cb.set_text("Lemon")
cb.add_state(lv.STATE.DISABLED)
cb.align(lv.ALIGN.TOP_LEFT, 0 ,60)
 
cb = lv.checkbox(lv.scr_act())
cb.add_state(lv.STATE.CHECKED | lv.STATE.DISABLED)
cb.set_text("Melon")
cb.align(lv.ALIGN.TOP_LEFT, 0 ,90)
 
print('mem used max: %0.2f kB' % (mem.getMax()))
print('mem used now: %0.2f kB' % (mem.getNow()))
python
LVGL 复选框控件演示
LVGL 复选框控件演示

拖放#

import pika_lvgl as lv
from PikaStdLib import MemChecker
 
mem = MemChecker()
 
def drag_event_handler(e):
 
    obj = e.get_target()
 
    indev = lv.indev_get_act()
 
    vect = lv.point_t()
    indev.get_vect(vect)
    x = obj.get_x() + vect.x
    y = obj.get_y() + vect.y
    obj.set_pos(x, y)
    mem.now()
 
 
# 使对象可拖动
 
obj = lv.obj(lv.scr_act())
obj.set_size(150, 100)
obj.add_event_cb(drag_event_handler, lv.EVENT.PRESSING, None)
 
label = lv.label(obj)
label.set_text("Drag me")
label.center()
python
LVGL 拖放演示
LVGL 拖放演示

标签控件#

import pika_lvgl as lv
import PikaStdLib
mem = PikaStdLib.MemChecker()
 
label1 = lv.label(lv.scr_act())
LV_LABEL_LONG_WRAP = 0
label1.set_long_mode(LV_LABEL_LONG_WRAP)      # 长行换行
# 启用文本中命令的重新着色
label1.set_recolor(True)
label1.set_text("#0000ff Re-color# #ff00ff words# #ff0000 of a# label, \
align the lines to the center and  wrap long text automatically.")
# 设置较小的宽度使行自动换行
label1.set_width(150)
label1.set_style_text_align(lv.ALIGN.CENTER, 0)
label1.align(lv.ALIGN.CENTER, 0, -40)
 
LV_LABEL_LONG_SCROLL_CIRCULAR = 3
label2 = lv.label(lv.scr_act())
label2.set_long_mode(LV_LABEL_LONG_SCROLL_CIRCULAR)  # 循环滚动
label2.set_width(150)
label2.set_text("It is a circularly scrolling text. ")
label2.align(lv.ALIGN.CENTER, 0, 40)
 
print('mem used max: %0.2f kB' % (mem.getMax()))
print('mem used now: %0.2f kB' % (mem.getNow()))
python
LVGL 标签控件演示
LVGL 标签控件演示

工作原理#

PikaScript 具有独特的 C 模块智能绑定工具。

只需在 pika_lvgl.pyi 中编写 Python 接口(.pyi 是 Python 接口文件):

# pika_lvgl.pyi
class arc(lv_obj):
    def set_end_angle(self, angle: int): ...
    def set_bg_angles(self, start: int, end: int): ...
    def set_angles(self, start: int, end: int): ...
python

然后 PikaScript 的预编译器可以自动绑定以下 C 函数,只需以 module_class_method 格式命名函数,无需任何额外工作。所有绑定和注册都是自动完成的:

/* pika_lvgl_arc.c */
void pika_lvgl_arc_set_end_angle(PikaObj* self, int angle) {
    lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj");
    lv_arc_set_end_angle(lv_obj, angle);
}
 
void pika_lvgl_arc_set_bg_angles(PikaObj *self, int start, int end){
    lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj");
    lv_arc_set_bg_angles(lv_obj, start, end);
}
 
void pika_lvgl_arc_set_angles(PikaObj *self, int start, int end){
    lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj");
    lv_arc_set_angles(lv_obj, start, end);
}
c

要使用模块,只需 import pika_lvgl,预编译器将自动扫描 main.py 并绑定 pika_lvgl 模块:

$ ./rust-msc-latest-win10.exe
(pikascript) packages installed:
    pikascript-core==v1.10.0
    PikaStdLib==v1.10.0
    PikaStdDevice==v1.10.0
 
(pikascript) pika compiler:
  scaning main.py...
    binding pika_lvgl.pyi...

预编译器用 Rust 编写,可在 Windows 和 Linux 上运行,并且完全开源。

除了绑定 C 模块,预编译器还在 PC 上将 Python 脚本编译为字节码,减小脚本大小并提高速度。


入门指南#

Visual Studio 上的模拟仓库可在 https://github.com/pikasTech/lv_pikascript 获得

关于作者

Lyon Lisboa
Lyon Lisboa

社区贡献者

开发者和 LVGL 社区贡献者,专注于嵌入式图形的脚本语言集成。

认识博客背后的作者们

了解那些分享 LVGL 知识的优秀作者们

查看作者

订阅我们的通讯 不错过任何关于 LVGL 的新闻。我们每月最多发送 2 封邮件。

LVGL

LVGL 是最受欢迎的免费开源嵌入式图形库,支持任何 MCU、MPU 和显示类型,助您构建精美的用户界面。

我们还提供 UI 设计、实现和咨询等服务。

© 2026 LVGL。保留所有权利。
YouTubeGitHubLinkedIn