什么是 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:

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

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

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
进度条控件#
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
按钮控件#
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
复选框控件#
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
拖放#
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
标签控件#
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
工作原理#
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 获得
