这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【M5StackTab5板卡试用】03--UiFlow2找茬

共1条 1/1 1 跳转至

【M5StackTab5板卡试用】03--UiFlow2找茬

助工
2026-01-21 12:06:40   被打赏 50 分(兑奖)     打赏

1. 背景

UiFlow2 通过 block 编程和 MicroPython 编程,效果是一样的,各有优劣。

 

1.1 block 编程

用彩色图块封装复杂的语法逻辑,类似于拼图。

优点:

        低门槛、零语法错误:不用担心括号、缩进错误;

        快速硬件集成:M5Stack 官方已将众多的传感器、执行器封装成了专用模块;

        UI设计联动:在UiFlow2中的UI设计器中拖拽生成的按钮、标签,可以直接在积木中选择对应的事件回调函数,流程非常顺滑

缺点:

        逻辑密度低:当项目变得复杂时,画布会变得非常混乱,难以维护;

 

1.2 MicroPython 编程

直接编写文本代码。

优点:

        极高的灵活性:某些高级功能在block中无法实现,只能通过 Python 代码完成;

        易于重用和版本控制:代码可以复制粘贴,可以提交到 git 等版本控制系统;

        数学与算法优势:处理复杂的数学运算、解析二进制协议时,写代码比拼积木快得多

缺点:

        硬件配置繁琐:需要手动查找引脚编号、配置通信协议参数;

        调试繁琐:缩进错误、变量名写错等需要调试时才会报错

 

2. 运行 page 示例

https://uiflow-micropython.readthedocs.io/en/latest/m5ui/page.html

 

这个教程中的 micropython 代码拷贝粘贴到 UiFlow2 编码区,如下图,先点击 Read Mode 切换到 Custom Edit 模式,可以修改 MicroPython 代码,把教程中的代码粘贴过来。

image.png

2.1 运行报错

教程中的代码运行报错了,如下所示,提示 M5Screen 属性是不存在的。

image.png

2.2 问题定位

比较教程中的代码和 block对应的代码,发现教程中使用了 m5ui.M5Screen(),而 block 对应的代码使用的是 m5ui.M5Page()

        这就解释了报错 AttruibuteError: M5Screen,因为不存在;

        此外,教程对应的章节是 M5UI/M5Page,更加说明了 M5Screen 是不存在的,只有 M5Page 才是合法的;


image.png

2.3 修改教程代码

原代码意图:长按屏幕时,屏幕背景颜色变为黑色;当松开屏幕时,背景颜色恢复为白色。

由于原代码有问题,处理page的触摸事件不能正常切换颜色,我去掉了 click/long_press 事件回调函数,现在能正常响应。

 

修改后的完整代码如下:


# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
#
# SPDX-License-Identifier: MIT

import os, sys, io
import M5
from M5 import *
import m5ui
import lvgl as lv

page0 = None

def page0_pressed_event(event_struct):
    global page0

    page0.set_bg_color(0x000000, 255, 0)

def page0_released_event(event_struct):
    global page0

    page0.set_bg_color(0xFFFFFF, 255, 0)

# def page0_clicked_event(event_struct):
#     global page0

#     page0.set_bg_color(0x000000, 255, 0)

# def page0_long_pressed_event(event_struct):
#     global page0

#     page0.set_bg_color(0x000000, 255, 0)

def page0_event_handler(event_struct):
    global page0
    event = event_struct.code
    if event == lv.EVENT.PRESSED and True:
        page0_pressed_event(event_struct)
    if event == lv.EVENT.RELEASED and True:
        page0_released_event(event_struct)
    # if event == lv.EVENT.CLICKED and True:
    #     page0_clicked_event(event_struct)
    # if event == lv.EVENT.LONG_PRESSED and True:
    #     page0_long_pressed_event(event_struct)
    return

def setup():
    global page0

    M5.begin()
    m5ui.init()    page0 = m5ui.M5Page(bg_c=0xFFFFFF) # 注意是 m5ui.M5Page

    page0.add_event_cb(page0_event_handler, lv.EVENT.ALL, None)

    page0.screen_load()

def loop():
    global page0
    M5.update()

if __name__ == "__main__":
    try:
        setup()
        while True:
            loop()
    except (Exception, KeyboardInterrupt) as e:
        try:
            m5ui.deinit()
            from utility import print_error_msg

            print_error_msg(e)
        except ImportError:
            print("please update to latest firmware")


2.4 运行演示

 

参见 uiflow2-m5page-event.gif


uiflow2-m5page-event-480.gif






关键词: m5stack     tab5     uiflow2     micr    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]