查看: 5309|回复: 14

[分享] GUI Guider+Python,强强联手

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3299

    主题

    6546

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32024
    最后登录
    2024-4-25
    发表于 2021-5-13 09:38:51 | 显示全部楼层 |阅读模式
    GUI Guider+Python,强强联手

    经过前两篇文章的忽悠介绍,相信大家已经蠢蠢欲动,打算马上着手移植一套LVGL+MP玩儿玩儿了。

    当然了,如果换作小编的话,听说了这么好玩儿的东西,肯定会马上放下电话那头的客户,先来他一套代码尝尝。
    不过呢,小编今天还是要请大家先等等,因为今天小编还将为大家带来另一份神秘大礼。小编拍胸脯保证,绝对不会让大家失望。

    设计师的烦恼

    如果之前接触/使用过LVGL的朋友们,可能有这么一个大大的烦恼,就是LVGL不像桌面电脑的Qt那样,有一个辅助的GUI设计工具,当我们想放置或者说设计一个控件的时候,需要不断地调整其配置参数,才能达到我们满意的效果。而且,往往添加一个控件可不是简简单单一行代码就OK的。
    如果只是单单的控件添加,我们一般还是可以应付的。但是,往往事情并不是我们想象的那样简单,我们还需要围绕这一个控件做很多事情,比如加个label,加点style属性等,这么一来,可能我们的草稿纸都不够画的了。可以说,LVGL的确好用,就是开发起复杂GUI来,有一丢丢的小麻烦。
    开发神器降临

    就在这时,一缕阳光照了进来,为方便设计开发,恩智浦为LVGL开发了一套上位机GUI设计工具--GUIGuider(详见《GUI Guider为LVGL装上翅膀,加速开发》一文),让用户可以通过拖拽的方式轻松设计GUI界面,让广大用户如虎添翼,享受设计,加速开发流程。
    用户所设计的GUI,最终会被转换成C语言源代码,方便整合到MCU项目中。同时集成了上位机仿真器,即便不连接板子,也能提前尝鲜我们自己设计的GUI。

    看到这里,可能大家会有点疑问,这一切仿佛和我们今天要讲的没太大关系,因为小编说了何不试试Python,怎么说来说去又说到C了。莫慌,小编这就开始开门见山。

    没错,尽管有了GUI Guider这款神器,但只能转换出C语言,并不能为我们所用,似乎和我们强调的用Python去开发界面没啥太大关系。

    小编还是不卖关子了,考虑到GUI Guider的强大,小编最近手写了一套可以实现将GUI Guider转换出的C代码,再转换为Python代码的小程序,就赶紧来和大家分享了。有了它,我们就可以让GUI Guider为我们所用,哈哈哈。

    此处小编就不向大家哭诉开发过程了,想要尝鲜的朋友们,可以从这里下载。

    操作入门1-2-3

    此款神器使用方法如下:

    首先请大家参照《GUI Guider为LVGL装上翅膀,加速开发》安装GUI guider,以下操作与文中略有不同,请大家按以下步骤操作。

    1,开启GUI Guider,创建一个新项目:
       a.输入项目名称
       b.点选BOARD TEMPLATES然后选择Simulator
       c.点选APPLICATION TEMPLATES然后选择emptyDemo,
       d.COLOR DEPTH选择16bit,SIZE根据大家的需要设置
       e.点选CREATE
    11.png
    2,此时用户就可以在这块空的画布上修改,拖拽自己喜欢的控件,开发GUI了

    在完成GUI设计之后,点击“Generate Code”产生LVGL的C代码,此处小编就为了省事儿,分别弄一个button,一个日历,一个roller,一个tab上去,可能有点丑,还请大家见谅:
    12.png

    3,生成了代码之后,不要急着导出

    因为此时是Simulator模式,不支持代码导出,依次点选Code Viewer并选择setup_screen.c:
    13.png
    4,将代码全部复制粘贴到程序下载路径

    并保存为gui_guider.txt,双击运行parse_lvgl_c.cpython-35.pyc,转换出的python代码将会保存在gui_guider_py.py中。
    14.png
    以下是代码对比部分,这是C代码的一部分:
    1. //Write codes screen
    2.         ui->screen = lv_obj_create(NULL, NULL);

    3.         //Write codes screen_btn0
    4.         ui->screen_btn0 = lv_btn_create(ui->screen, NULL);

    5.         //Write style LV_BTN_PART_MAIN for screen_btn0
    6.         static lv_style_t style_screen_btn0_main;
    7.         lv_style_init(&style_screen_btn0_main);

    8.         //Write style state: LV_STATE_DEFAULT for style_screen_btn0_main
    9.         lv_style_set_radius(&style_screen_btn0_main, LV_STATE_DEFAULT, 50);
    10.         lv_style_set_bg_color(&style_screen_btn0_main, LV_STATE_DEFAULT, lv_color_make(0xff, 0xff, 0xff));
    11.         lv_style_set_bg_grad_color(&style_screen_btn0_main, LV_STATE_DEFAULT, lv_color_make(0xff, 0xff, 0xff));
    12.         lv_style_set_bg_grad_dir(&style_screen_btn0_main, LV_STATE_DEFAULT, LV_GRAD_DIR_VER);
    13.         lv_style_set_bg_opa(&style_screen_btn0_main, LV_STATE_DEFAULT, 255);
    14.         lv_style_set_border_color(&style_screen_btn0_main, LV_STATE_DEFAULT, lv_color_make(0x01, 0xa2, 0xb1));
    15.         lv_style_set_border_width(&style_screen_btn0_main, LV_STATE_DEFAULT, 2);
    16.         lv_style_set_border_opa(&style_screen_btn0_main, LV_STATE_DEFAULT, 255);
    17.         lv_style_set_outline_color(&style_screen_btn0_main, LV_STATE_DEFAULT, lv_color_make(0xd4, 0xd7, 0xd9));
    复制代码
    这是对应转换出的Python代码的一部分:
    1. import lvgl as lv
    2. lv.init()
    3. scr = lv.obj()
    4. ui_screen_btn0 = lv.btn(lv.scr_act(), None)
    5. style_screen_btn0_main = lv.style_t()
    6. style_screen_btn0_main.init()
    7. style_screen_btn0_main.set_radius(lv.STATE.DEFAULT, 50)
    8. style_screen_btn0_main.set_bg_color(lv.STATE.DEFAULT, lv.color_make(0xff, 0xff, 0xff))
    9. style_screen_btn0_main.set_bg_grad_color(lv.STATE.DEFAULT, lv.color_make(0xff, 0xff, 0xff))
    10. style_screen_btn0_main.set_bg_grad_dir(lv.STATE.DEFAULT, lv.GRAD_DIR.VER)
    11. style_screen_btn0_main.set_bg_opa(lv.STATE.DEFAULT, 255)
    12. style_screen_btn0_main.set_border_color(lv.STATE.DEFAULT, lv.color_make(0x01, 0xa2, 0xb1))
    13. style_screen_btn0_main.set_border_width(lv.STATE.DEFAULT, 2)
    14. style_screen_btn0_main.set_border_opa(lv.STATE.DEFAULT, 255)
    15. style_screen_btn0_main.set_outline_color(lv.STATE.DEFAULT, lv.color_make(0xd4, 0xd7, 0xd9)
    复制代码
    是不是Python代码看起来清爽了很多呢?是不是想马上拥有了?那就让我们马上来看看运行效果。


    5,运行方式有两种选择


    如果是绑定了openMV的MicroPython版本,可以直接复制到openMV IDE中运行。
    如果是采用REPL的形式,也可以直接粘贴到REPL命令行,或是保存到MicroPython的文件系统中,实现上电运行
    因为小编的LVGL+MicroPython的绑定是基于openART工程的,这里采用的是openMV IDE的形式运行。
    实际运行效果:
    15.png


    我们在GUI Builder上绘制的GUI:
    16.png
    一切都是那样的美好!
    不过,小编也不能打保证小程序能转换所有的代码,目前来看由于种种限制问题,这个小小转换程序还有一些难以解决的小小问题,在使用时候还要大家注意。
    6,注意事项
    (也可以在read_me.txt中查看,或是生成的代码头部也能看到):
    a.代码仅包括GUI构建部分,buffer分配,显示以及触摸屏的驱动绑定部分需要手动操作
    b.在使用image控件时,需要手动定义lv.img_dsc_t()变量
    c.需要设置字体的场合,需要手动定义lv.font_t()变量
    d.不支持插入/使用动画效果
    e.不支持控件的callback,需要手动添加
    f.不支持文本控件,需要手动声明(lvgl默认文本绑定键盘,处理起来有些复杂)
    g.使用日历控件的时候,需要手动定义lv.calendata_data_t()变量,声明年月日


    目前小编暂时发现了这些限制,在遇到这些问题时,会以注释的方式体现在python中,用户可以据此修改。

    Let's GO


    对于想利用Python开发LVGL的朋友们,不妨试下,因为小程序刚刚出炉,如果大家在使用时候发现了哪些不便,或是有新的小bug,也希望大家能够多多提出宝贵意见。
    以上就是小编今天给大家带来的利用GUI Guider来构建GUI,并转换成对应的Python格式。




    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-22 15:28
  • 签到天数: 79 天

    [LV.6]常住居民II

    5

    主题

    405

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1407
    最后登录
    2024-3-22
    发表于 2021-5-13 09:41:25 来自手机 | 显示全部楼层
    学习一下py
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2024-2-5 12:06
  • 签到天数: 627 天

    [LV.9]以坛为家II

    94

    主题

    1628

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4429

    热心会员

    最后登录
    2024-2-5
    发表于 2021-5-13 09:44:58 | 显示全部楼层
    因吹斯汀~
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 270 天

    [LV.8]以坛为家I

    31

    主题

    2991

    帖子

    38

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5309

    活跃会员

    最后登录
    2024-4-25
    发表于 2021-5-13 10:22:20 | 显示全部楼层

    学习一下py
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2021-5-13 10:40:22 | 显示全部楼层
    现在硬件资源丰富的情况下,使用python也不是不可能的了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-5-13 16:54
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    1

    主题

    20

    帖子

    0

    注册会员

    Rank: 2

    积分
    53
    最后登录
    2024-3-13
    发表于 2021-5-13 16:50:13 | 显示全部楼层
    python慢慢吃开了啊,但是现在不知道用python写的多不多
    签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-9-17 19:57
  • 签到天数: 2310 天

    [LV.Master]伴坛终老

    107

    主题

    4270

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    10481
    最后登录
    2023-9-17
    发表于 2021-5-15 10:25:33 | 显示全部楼层
    啥时有MP+LVGL活动啊,先报个名
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 00:09
  • 签到天数: 748 天

    [LV.9]以坛为家II

    23

    主题

    1358

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    5220
    最后登录
    2024-4-24
    发表于 2021-5-17 08:54:07 | 显示全部楼层
    python啊,我感觉我又行了。。。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 10:22
  • 签到天数: 1317 天

    [LV.10]以坛为家III

    124

    主题

    2831

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7570
    最后登录
    2024-4-10
    发表于 2021-6-1 16:52:19 | 显示全部楼层
    学习了            
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    22 小时前
  • 签到天数: 1047 天

    [LV.10]以坛为家III

    0

    主题

    1508

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4031
    最后登录
    2024-4-24
    发表于 2021-6-1 23:33:56 | 显示全部楼层
    学习了            
    酷酷酷哦你很快
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-25 22:00 , Processed in 0.165392 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表