From ae10bf8ebf8dfa75471164190a10d1def823ae0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dustin=20Wei=28=E9=9F=A6=E4=BC=9F=29?= Date: Mon, 6 May 2024 15:15:24 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E6=9B=B4=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=9D=97=E4=B8=AD=E7=9A=84=E4=B8=AD=E6=96=87=E5=86=92=E5=8F=B7?= =?UTF-8?q?=E4=B8=BA=E8=8B=B1=E6=96=87=E5=86=92=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zh/solutions/Wear/readme.md | 142 +++++++++--------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/docs/Application_guide/zh/solutions/Wear/readme.md b/docs/Application_guide/zh/solutions/Wear/readme.md index a12f3cef..a94f7725 100644 --- a/docs/Application_guide/zh/solutions/Wear/readme.md +++ b/docs/Application_guide/zh/solutions/Wear/readme.md @@ -7,7 +7,7 @@ ![image-20231124092228717](../../media/solutions/Wear/image-20231124092228717.png) -穿戴行业方案使用 [LVGL](https://lvgl.io/) 绘制图形化界面,它是一个轻量级的、开源的嵌入式图形库。QuecPython 集成了 LVGL,并且使用 NXP 公司的 [GUI Guider](https://www.nxp.com/design/software/development-software/gui-guider:GUI-GUIDER) 作为图形化界面设计工具,能自动生成 QuecPython 代码,极大提高了嵌入式平台图形化界面设计的效率。 +穿戴行业方案使用 [LVGL](https://lvgl.io/) 绘制图形化界面,它是一个轻量级的、开源的嵌入式图形库。QuecPython 集成了 LVGL,并且使用 NXP 公司的 [GUI Guider](https://www.nxp.com/design/software/development-software/gui-guider:GUI-GUIDER) 作为图形化界面设计工具,能自动生成 QuecPython 代码,极大提高了嵌入式平台图形化界面设计的效率。 @@ -204,85 +204,85 @@ EventMesh 的设计框架如下图所示: # 如果添加新的界面 class **Screen 必须继承与Screen, lv.obj对象必须提前实现好 -Class DemoScreen(Screen): +Class DemoScreen(Screen): # NAME必须, 这个是找到对应的界面跳转的唯一通道 - # 例如我们使用 EventMesh.publish("load_screen", {"screen": "demo_screen"}) + # 例如我们使用 EventMesh.publish("load_screen", {"screen": "demo_screen"}) # 其中demo_screen就是去找NAME这个字段找到他 NAME = “demo_screen” - def __init__(self): + def __init__(self): super().__init__() # 这是核心跳转对象 self.meta = app_list_screen # prop可以获取跳转信息例如, 可以获取跳转来的信息 - # EventMesh.publish("load_screen", {"screen": "demo_screen", “test”:1}) - # 则此界面的prop = {"screen": "demo_screen", “test”:1} + # EventMesh.publish("load_screen", {"screen": "demo_screen", "test": 1}) + # 则此界面的prop = {"screen": "demo_screen", "test": 1} self.prop = None # 用户实现此接口, 会在ui.add_screen(DemoScreen())的时候调用, 只会在添加的时候执行一次 - def post_processor_after_instantiation(self, *args, **kwargs): + def post_processor_after_instantiation(self, *args, **kwargs): """实例化后调用""" pass - # 每当EventMesh.publish("load_screen", {"screen": "demo_screen"})跳转到此界面 + # 每当EventMesh.publish("load_screen", {"screen": "demo_screen"})跳转到此界面 # 会依次执行 # post_processor_before_initialization # initialization # post_processor_after_initialization # 用户可以在此实现他的功能, 因为每次跳转进来都会执行 - def post_processor_before_initialization(self, *args, **kwargs): + def post_processor_before_initialization(self, *args, **kwargs): """初始化之前调用""" pass - def initialization(self, *args, **kwargs): + def initialization(self, *args, **kwargs): """初始化load""" pass - def post_processor_after_initialization(self, *args, **kwargs): + def post_processor_after_initialization(self, *args, **kwargs): """初始化之后调用""" pass # 会在离开此界面的时候执行, 比如说目前在此界面你通过下面 - # EventMesh.publish("load_screen", {"screen": "main_screen"}) + # EventMesh.publish("load_screen", {"screen": "main_screen"}) # 跳转到main界面的话, 会先执行此界面的离开方法, 在执行main界面的初始化方法 - def deactivate(self, *args, **kwargs): + def deactivate(self, *args, **kwargs): """初始化load""" pass # 注意事项, 如果界面是瓦片界面tileview的界面的话需要额外添加对应关系才能使用 -# EventMesh.publish("load_screen", {"screen": "main_screen"})进行跳转 +# EventMesh.publish("load_screen", {"screen": "main_screen"})进行跳转 # 详见下列UI的类中的关系 -class UI(Abstract): - def __init__(self): +class UI(Abstract): + def __init__(self): self.screens = [] self.current = None # 需要在下面的map中添加瓦片的映射关系, display_screen对应的是0行0列的瓦片 # 并且跳转是不进行动画的行为的 # main_screen是1行, 0列的瓦片依次如下 self.tileview_map = { - "display_screen": [0, 0, lv.ANIM.OFF], - "main_screen": [1, 0, lv.ANIM.OFF], - "watch_face_screen": [2, 0, lv.ANIM.OFF], - "app_list_1_screen": [3, 0, lv.ANIM.OFF], - "app_list_2_screen": [4, 0, lv.ANIM.OFF], - "heart_screen": [5, 0, lv.ANIM.OFF], - "blood_screen": [6, 0, lv.ANIM.OFF], - "temp_screen": [7, 0, lv.ANIM.OFF], + "display_screen": [0, 0, lv.ANIM.OFF], + "main_screen": [1, 0, lv.ANIM.OFF], + "watch_face_screen": [2, 0, lv.ANIM.OFF], + "app_list_1_screen": [3, 0, lv.ANIM.OFF], + "app_list_2_screen": [4, 0, lv.ANIM.OFF], + "heart_screen": [5, 0, lv.ANIM.OFF], + "blood_screen": [6, 0, lv.ANIM.OFF], + "temp_screen": [7, 0, lv.ANIM.OFF], } # 这和上面界面和瓦片的关系相反 # 0行0列代表, display_screen # 依次如下 self.tileview_position_map = { - (0, 0): "display_screen", - (1, 0): "main_screen", - (2, 0): "watch_face_screen", - (3, 0): "app_list_1_screen", - (4, 0): "app_list_2_screen", - (5, 0): "heart_screen", - (6, 0): "blood_screen", - (7, 0): "temp_screen", + (0, 0): "display_screen", + (1, 0): "main_screen", + (2, 0): "watch_face_screen", + (3, 0): "app_list_1_screen", + (4, 0): "app_list_2_screen", + (5, 0): "heart_screen", + (6, 0): "blood_screen", + (7, 0): "temp_screen", } @@ -307,38 +307,38 @@ main_screen = lv_obj( 以应用列表控件的触摸为例,代码如下: ```python -class AppList1Screen(Screen): +class AppList1Screen(Screen): NAME = "app_list_1_screen" - def __init__(self): + def __init__(self): super().__init__() self.meta = app_list_screen self.container = app_list_cont self.profile = [ - ["U:/media/app_heart.png", {"screen": "blood_screen"}], - ["U:/media/app_phone.png", {"screen": "dail_screen"}], - ["U:/media/app_chat.png", None], - ["U:/media/app_time.png", None] + ["U:/media/app_heart.png", {"screen": "blood_screen"}], + ["U:/media/app_phone.png", {"screen": "dail_screen"}], + ["U:/media/app_chat.png", None], + ["U:/media/app_time.png", None] ] self.btn_list = [] self.bottom = None self.bottom_profile = [ - ["U:/media/wpoint.png"], - ["U:/media/bpoint.png"], - ["U:/media/bpoint.png"], - ["U:/media/bpoint.png"] + ["U:/media/wpoint.png"], + ["U:/media/bpoint.png"], + ["U:/media/bpoint.png"], + ["U:/media/bpoint.png"] ] self.bottom_btn_list = [] - def btn_click(self, event, i): + def btn_click(self, event, i): screen_info = self.profile[i][1] - if screen_info: + if screen_info: # 在找到对应的点击事件, 跳转页面 EventMesh.publish("load_screen", screen_info) - def post_processor_after_instantiation(self): + def post_processor_after_instantiation(self): # 会在add_screen的时候调用进行实例化 - for i, btn_profile in enumerate(self.profile): + for i, btn_profile in enumerate(self.profile): btn = lv_img( parent=self.container, size=(110, 110), @@ -353,7 +353,7 @@ class AppList1Screen(Screen): ] ) # 给每个按键添加了, 点击事件 - btn.add_event_cb(lambda event, cur=i: self.btn_click(event, cur), lv.EVENT.CLICKED, None) + btn.add_event_cb(lambda event, cur=i: self.btn_click(event, cur), lv.EVENT.CLICKED, None) self.btn_list.append(btn) self.bottom = lv_obj( parent=app_list_screen, @@ -369,7 +369,7 @@ class AppList1Screen(Screen): (style_app_list, lv.PART.MAIN | lv.STATE.DEFAULT), ], ) - for btn_profile in self.bottom_profile: + for btn_profile in self.bottom_profile: btn = lv_img( parent=self.bottom, size=(8, 8), @@ -385,7 +385,7 @@ class AppList1Screen(Screen): self.bottom_btn_list.append(btn) ``` -该段代码的核心语句是 `EventMesh.publish("load_screen", screen_info)` ,该语句发送一个名为 `"load_screen"` 的事件,意为加载新的屏幕界面;携带的消息为 `screen_info`, `screen_info`就是`{"screen": "blood_screen"}`要跳转的界面,即屏幕界面的名称,表示加载的是血氧显示界面。 +该段代码的核心语句是 `EventMesh.publish("load_screen", screen_info)` ,该语句发送一个名为 `"load_screen"` 的事件,意为加载新的屏幕界面;携带的消息为 `screen_info`, `screen_info`就是`{"screen": "blood_screen"}`要跳转的界面,即屏幕界面的名称,表示加载的是血氧显示界面。 @@ -396,39 +396,39 @@ class AppList1Screen(Screen): 代码如下: ```python -class UI(Abstract): +class UI(Abstract): - def __init__(self): + def __init__(self): ... - def lv_load(self, event, msg): - for screen in self.screens: - if screen.NAME == msg["screen"]: + def lv_load(self, event, msg): + for screen in self.screens: + if screen.NAME == msg["screen"]: scr = screen - if self.current != scr: - if self.current: + if self.current != scr: + if self.current: self.current.deactivate() - scr.last_screen_info = {"screen": self.current.NAME} + scr.last_screen_info = {"screen": self.current.NAME} scr.set_prop(msg) scr.post_processor_before_initialization() scr.initialization() scr.post_processor_after_initialization() self.current = scr - if msg["screen"] in self.tileview_map: + if msg["screen"] in self.tileview_map: lv.scr_load(tileview_screen) tileview.set_tile_id(*self.tileview_map[msg['screen']]) - else: + else: lv.scr_load(self.current.meta) - def post_processor_after_instantiation(self): + def post_processor_after_instantiation(self): EventMesh.subscribe("load_screen", self.lv_load) EventMesh.subscribe("load_tileview", self.lv_tileview) - def add_screen(self, screen): + def add_screen(self, screen): screen.post_processor_after_instantiation() self.screens.append(screen) - def start(self): + def start(self): self.post_processor_after_instantiation() ``` @@ -442,7 +442,7 @@ class UI(Abstract): > > 细心的读者会发现,每一个屏幕界面脚本文件中实现的类中,其类下面 中,都会有类似 `NAME = "main_screen"` 的语句。该语句便记录了屏幕界面的名称。 -- `EventMesh.publish("load_screen", {"screen": "main_screen"})` 语句用来触发第一个界面显示,即主界面。 +- `EventMesh.publish("load_screen", {"screen": "main_screen"})` 语句用来触发第一个界面显示,即主界面。 至此,穿戴方案的图形化界面启动完毕,后续界面的切换由用户触摸控制。 @@ -450,7 +450,7 @@ class UI(Abstract): ### 图形化界面设计 -上文提到,QuecPython 使用 NXP 公司的 [GUI Guider](https://www.nxp.com/design/software/development-software/gui-guider:GUI-GUIDER) 作为图形化界面设计工具,该工具不仅能够进行界面布局设计,还能自动生成 QuecPython 代码。[点此查看 GUI Guider 工具的使用教程](https://python.quectel.com/doc/Application_guide/zh/multi-media/lvgl/lvgl_ui_tool.html)。 +上文提到,QuecPython 使用 NXP 公司的 [GUI Guider](https://www.nxp.com/design/software/development-software/gui-guider:GUI-GUIDER) 作为图形化界面设计工具,该工具不仅能够进行界面布局设计,还能自动生成 QuecPython 代码。[点此查看 GUI Guider 工具的使用教程](https://python.quectel.com/doc/Application_guide/zh/multi-media/lvgl/lvgl_ui_tool.html)。 下文以穿戴方案的应用为例,来介绍图形化界面的设计过程。 @@ -542,7 +542,7 @@ main_top_cont_1 = lv_obj( main_top_cont_1_img_signal = lv_img( parent=main_top_cont_1, size=(20, 20), - src="U:/media/s4.png", + src="U:/media/s4.png", style=[ (style_cont, lv.PART.MAIN | lv.STATE.DEFAULT), (style_list_scrollbar, lv.PART.SCROLLBAR | lv.STATE.DEFAULT), @@ -585,7 +585,7 @@ main_top_cont_2 = lv_obj( main_top_cont_2_img_gps = lv_img( parent=main_top_cont_2, size=(20, 20), - src="U:/media/point.png", + src="U:/media/point.png", style=[ (style_cont, lv.PART.MAIN | lv.STATE.DEFAULT), (style_list_scrollbar, lv.PART.SCROLLBAR | lv.STATE.DEFAULT), @@ -599,7 +599,7 @@ main_top_cont_2_img_gps = lv_img( main_top_cont_2_img_bat = lv_img( parent=main_top_cont_2, size=(20, 20), - src="U:/media/bat4.png", + src="U:/media/bat4.png", style=[ (style_cont, lv.PART.MAIN | lv.STATE.DEFAULT), (style_list_scrollbar, lv.PART.SCROLLBAR | lv.STATE.DEFAULT), @@ -676,7 +676,7 @@ main_content_cont_1_hour = lv_obj( main_content_cont_1_hour_0 = lv_img( parent=main_content_cont_1_hour, size=(58, 100), - src="U:/media/h0.png", + src="U:/media/h0.png", style=[ (style_cont, lv.PART.MAIN | lv.STATE.DEFAULT), (style_list_scrollbar, lv.PART.SCROLLBAR | lv.STATE.DEFAULT), @@ -689,7 +689,7 @@ main_content_cont_1_hour_0 = lv_img( main_content_cont_1_hour_1 = lv_img( parent=main_content_cont_1_hour, size=(58, 100), - src="U:/media/h8.png", + src="U:/media/h8.png", style=[ (style_cont, lv.PART.MAIN | lv.STATE.DEFAULT), (style_list_scrollbar, lv.PART.SCROLLBAR | lv.STATE.DEFAULT), @@ -719,7 +719,7 @@ main_content_cont_1_m = lv_obj( main_content_cont_1_m_0 = lv_img( parent=main_content_cont_1_m, size=(58, 100), - src="U:/media/m0.png", + src="U:/media/m0.png", style=[ (style_cont, lv.PART.MAIN | lv.STATE.DEFAULT), (style_list_scrollbar, lv.PART.SCROLLBAR | lv.STATE.DEFAULT), @@ -733,7 +733,7 @@ main_content_cont_1_m_0 = lv_img( main_content_cont_1_m_1 = lv_img( parent=main_content_cont_1_m, size=(58, 100), - src="U:/media/m8.png", + src="U:/media/m8.png", style=[ (style_cont, lv.PART.MAIN | lv.STATE.DEFAULT), (style_list_scrollbar, lv.PART.SCROLLBAR | lv.STATE.DEFAULT), -- Gitee From fdfc135acdd108d3b5509e951113307416d54249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dustin=20Wei=28=E9=9F=A6=E4=BC=9F=29?= Date: Mon, 6 May 2024 15:17:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E8=8B=B1=E6=96=87?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E4=B8=AD=E7=9A=84=E4=B8=AD=E6=96=87=E5=86=92?= =?UTF-8?q?=E5=8F=B7=E4=B8=BA=E8=8B=B1=E6=96=87=E5=86=92=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Application_guide/en/solutions/Wear/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Application_guide/en/solutions/Wear/readme.md b/docs/Application_guide/en/solutions/Wear/readme.md index 7642ab6a..757f0cb2 100644 --- a/docs/Application_guide/en/solutions/Wear/readme.md +++ b/docs/Application_guide/en/solutions/Wear/readme.md @@ -26,7 +26,7 @@ Components: - Hour/Minute/Second hand: Updated in real time with the current time - Background dial showing current time - Date display: The date is refreshed in real time -3. **Interactions:** +3. **Interactions:** - Swipe left on the digital dial to enter the lock screen, swipe right to enter the analog dial - Swipe left on the analog dial to enter the digital dial, swipe right to enter the app list 1 - After 30s of inactivity, the device will enter lock screen. Swipe right to unlock and enter dial -- Gitee