<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[麻雀板使用micropython开发lvgl]]></title><description><![CDATA[<h2>前言</h2>
<p dir="auto"><strong>为什么要使用micropython来开发lvgl而不是用c?</strong><br />
当然在资源非常受限的芯片比如单片机上c开发会是很好的选择，或者对于某些不喜欢mpy解释器特性的也不适合。这些都不是本教程谈论的重点，我们先来看看使用micropython开发起来有何不同。</p>
<p dir="auto">我们先来看看lvgl官网关于这个的介绍：<code>https://docs.lvgl.io/master/get-started/micropython.html</code><br />
<code>https://blog.lvgl.io/2019-02-20/micropython-bindings</code><br />
截取其中提到的一些要点（google网页翻译内容）：<br />
<img src="https://img-blog.csdnimg.cn/98afb94c45454601aae0597172125436.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Iie5YiA5Lmm55Sf,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" class=" img-responsive img-markdown" width="771" height="590" /><br />
lvgl官网也做了在线模拟器支持：</p>
<blockquote>
<p dir="auto">如果您想在不下载任何东西的情况下尝试LVGL + Micropython - 您可以使用我们的在线模拟器！<br />
它是一个功能齐全的LVGL + Micropython，完全在浏览器中运行，并允许您编辑python脚本并运行它。<br />
<a href="https://sim.lvgl.io/" target="_blank" rel="noopener noreferrer nofollow ugc">单击此处在在线模拟器上进行实验</a></p>
</blockquote>
<p dir="auto">这个是基于micropython 的js端口移植实现的，所以在模拟器上跑的py代码我们也可以移植到板子上来运行，只需要更改驱动部分代码适配自己的板子即可。</p>
<h2>unix端口上的开发</h2>
<p dir="auto">关于支持lvgl的micropython固件编译可以参考我之前的文章：<br />
<a href="https://blog.csdn.net/qq_34440409/article/details/118365689" target="_blank" rel="noopener noreferrer nofollow ugc">支持LVGL的micropython固件编译（一）</a><br />
<a href="https://blog.csdn.net/qq_34440409/article/details/118421452" target="_blank" rel="noopener noreferrer nofollow ugc">支持LVGL的micropython固件编译（二）arm板移植</a><br />
下面以芒果派麻雀板（全志D1s芯片，risc-v架构）为例来讲下如何在linux上使用mpy开发lvgl应用。<br />
移植好的芒果派麻雀板的mpy解释器，以及相关例子都维护在了我的仓库中：<code>https://gitee.com/l_y_r/micropython_lvgl_example/tree/master</code><br />
可以参考仓库里的例子自行实践。</p>
<h3>micropython的命令行选项</h3>
<p dir="auto">要开发首先要熟悉下mpy解释器，先贴出官方的相关文档 <a href="http://docs.micropython.org/en/latest/unix/quickref.html" target="_blank" rel="noopener noreferrer nofollow ugc">UNIX 和 Windows 端口的快速参考</a><br />
以下几个要点需要注意：</p>
<ol>
<li>-i参数主要用来在运行脚本后调试使用，进本执行后会进入repl模式下，此时可以通过tab键补全查看到脚本中导入的所有对象，并可调用代码，动态更改运行。</li>
<li>mpy固件默认是1M的内存堆栈大小，如果写的py程序内存占用过多，可以使用<code>-X heapsize=8M</code>指令来改到8M大小执行脚本，当然改成其他大小也可以。</li>
<li>同python一样mpy也有外部模组引用路径，默认的搜索路径为<code>~/.micropython/lib:/usr/lib/micropython</code>，我们可以通过设置MICROPYPATH环境变量来覆盖搜索路径。在linux端口上可能会遇到mpy固件内置的py模组无法import 问题，可以通过在脚本开头加以下代码解决：<pre><code class="language-python"># Workaround for including frozen modules when running micropython with a script argument
# https://github.com/micropython/micropython/issues/6419
import usys as sys
sys.path.append('')
</code></pre>
</li>
</ol>
<h3>unix端口上lvgl显示以及输入设备驱动</h3>
<p dir="auto">linux上通常使用fb来驱动屏幕显示，另外也有drm，在ubuntu等发行版上会使用sdl库封装来提供给上层操作的接口。<br />
我们的mpy解释器从<code>https://github.com/lvgl/lv_micropython</code>移植而来，在该工程中也包含了驱动模组以及使用例程，路径如下：</p>
<ul>
<li>lib/lv_bindings/driver/linux：<br />
linux的驱动输入以及fb显示驱动（已经内置到解释器）</li>
<li>lib/lv_bindings/lib：<br />
其他依赖库（按需选择）</li>
<li>lib/lv_bindings/examples：<br />
使用例程</li>
</ul>
<h3>简单的例子</h3>
<p dir="auto">我的仓库中<code>https://gitee.com/l_y_r/micropython_lvgl_example/tree/master</code> 写好了fb_test.py<br />
可以参考实现。<br />
其中同时注册了鼠标以及触摸输入驱动</p>
<pre><code class="language-python">mouse = evdev.mouse_indev(scr)
mouse = evdev.tp_indev(scr,device='/dev/input/event2')
</code></pre>
<p dir="auto">两种输入设备可以同时工作。</p>
<h3>lvgl的深入开发</h3>
<p dir="auto">基本的概念有了，想要实现更多调整怎么办呢？比如更改某个控件颜色，大小，位置等等。<br />
如果你对c开发lvgl很熟悉，那么很简单，由于mpy版的lvgl模组就是通过lvgl的c代码自动化封装而来，所以在函数接口名称上格式基本一致，参数上也是一样的，区别在于c以面向对象模式开发，第一个参数为对象指针，而在对应的mpy接口中，这个参数省略，因为本身就携带了对象。c函数封装为mpy模组的中间文件在这里：<code>lib/lv_bindings/gen/lv_mpy_example.c</code>，从这个文件里找到mpy函数接口所对应的c接口。<br />
看下面一个例子：<br />
控件对齐函数<br />
c中接口为</p>
<pre><code class="language-c">void lv_obj_align(lv_obj_t * obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs)
{
    lv_obj_set_style_align(obj, align, 0);
    lv_obj_set_pos(obj, x_ofs, y_ofs);
}
</code></pre>
<p dir="auto">mpy封装中间层c中接口为：</p>
<pre><code class="language-c">/*
 * lvgl extension definition for:
 * void lv_obj_align(struct _lv_obj_t *obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs)
 */
 
STATIC mp_obj_t mp_lv_obj_align(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr)
{
    struct _lv_obj_t *obj = mp_to_lv(mp_args[0]);
    lv_align_t align = (uint8_t)mp_obj_get_int(mp_args[1]);
    lv_coord_t x_ofs = (int16_t)mp_obj_get_int(mp_args[2]);
    lv_coord_t y_ofs = (int16_t)mp_obj_get_int(mp_args[3]);
    ((void (*)(struct _lv_obj_t *, lv_align_t, lv_coord_t, lv_coord_t))lv_func_ptr)(obj, align, x_ofs, y_ofs);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_align_obj, 4, mp_lv_obj_align, lv_obj_align);
</code></pre>
<p dir="auto">mpy应用层使用例子：</p>
<pre><code class="language-py">
import lvgl as lv
scr = lv.obj()
btn = lv.btn(scr)
btn.align(lv.ALIGN.CENTER, 0, 0)
</code></pre>
<p dir="auto">scr与btn都是一个lvgl obj，align是基于这个对象实例去调用接口的，只需要传入3个参数：对齐方向，x偏移，y偏移。<br />
所以说就api使用来看，看C接口文档同样适用于mpy开发。官方的api文档位于：<code>https://docs.lvgl.io/master/widgets/index.html</code></p>
<p dir="auto">如果你对开发lvgl毫无经验也没有关系，可以直接参考官方的例子实现，对于mpy使用各个部件基本都做了例子：<code>https://docs.lvgl.io/master/examples.html</code>。<br />
另外进入mpy的repl模式下导入lvgl也可以使用tab补全的方式查看每个对象可以使用的函数接口<br />
<img src="https://img-blog.csdnimg.cn/09e6f0180a454411a72a1080edd704a5.png" alt="在这里插入图片描述" class=" img-responsive img-markdown" width="492" height="156" /></p>
<h3>lvgl的设计器使用：EdgeLine，SquareLine</h3>
<p dir="auto">目前lvgl设计器（EdgeLine）还处在测试阶段v0.3版本，可以从这里下载体验：<a href="https://download.csdn.net/download/qq_34440409/21458254?spm=1001.2014.3001.5503" target="_blank" rel="noopener noreferrer nofollow ugc">https://download.csdn.net/download/qq_34440409/21458254?spm=1001.2014.3001.5503</a><br />
使用设计器布局完成后可以导出mpy代码文件，导出的代码是lvgl7版本。<br />
然后增加显示，输入驱动代码即可。</p>
<p dir="auto">正式版本1.0已经在2022年2月8号发布，改名为SquareLine，目前释放了付费版本，预计免费版还要过段时间才会放出，不过这个付费版有30天的免费体验时间，没有限制，无需注册，安装包下载链接：<br />
<a href="https://download.csdn.net/download/qq_34440409/79838814" target="_blank" rel="noopener noreferrer nofollow ugc">https://download.csdn.net/download/qq_34440409/79838814</a><br />
该版本基于lvgl8.2，可以导出c或micropython代码。</p>
]]></description><link>https://bbs.aw-ol.com/topic/1032/麻雀板使用micropython开发lvgl</link><generator>RSS for Node</generator><lastBuildDate>Sun, 08 Mar 2026 13:40:50 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/1032.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Feb 2022 03:25:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 麻雀板使用micropython开发lvgl on Wed, 16 Feb 2022 04:58:48 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://bbs.aw-ol.com/uid/44">@whycan</a> 我的镜像固件所用的屏幕触摸都是另外适配的，所以就不放固件了，可以参考 <a href="https://gitee.com/l_y_r/micropython_lvgl_example/tree/master" target="_blank" rel="noopener noreferrer nofollow ugc">https://gitee.com/l_y_r/micropython_lvgl_example/tree/master</a> 里面的安装使用教程，集成到自己固件测试<br />
<img src="/assets/uploads/files/1644983618937-203967d8-a7a8-4088-9e18-fd214a290587-image.png" alt="203967d8-a7a8-4088-9e18-fd214a290587-image.png" class=" img-responsive img-markdown" width="702" height="467" /><br />
<img src="/assets/uploads/files/1644983634214-5329260e-e084-4068-a6ab-dafea2583ef9-image.png" alt="5329260e-e084-4068-a6ab-dafea2583ef9-image.png" class=" img-responsive img-markdown" width="671" height="234" /></p>
]]></description><link>https://bbs.aw-ol.com/post/4375</link><guid isPermaLink="true">https://bbs.aw-ol.com/post/4375</guid><dc:creator><![CDATA[lyr2021]]></dc:creator><pubDate>Wed, 16 Feb 2022 04:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to 麻雀板使用micropython开发lvgl on Wed, 16 Feb 2022 03:49:26 GMT]]></title><description><![CDATA[<p dir="auto">这个太6了，有没有固件可以直接烧录测试呢？</p>
]]></description><link>https://bbs.aw-ol.com/post/4374</link><guid isPermaLink="true">https://bbs.aw-ol.com/post/4374</guid><dc:creator><![CDATA[whycan]]></dc:creator><pubDate>Wed, 16 Feb 2022 03:49:26 GMT</pubDate></item></channel></rss>