{"id":19484401,"url":"https://github.com/funnygeeker/micropython-easymenu","last_synced_at":"2025-07-01T07:04:04.611Z","repository":{"id":113375060,"uuid":"605985156","full_name":"funnygeeker/micropython-easymenu","owner":"funnygeeker","description":"A simple menu library for Micropython.  MicroPython 的简易菜单库","archived":false,"fork":false,"pushed_at":"2024-04-27T04:23:54.000Z","size":55945,"stargazers_count":21,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-25T16:46:35.163Z","etag":null,"topics":["bmp","chinese","english","esp32","esp32-c3","esp32-s3","esp8266","menu","micropython","micropython-easydisplay","pbm","ssd1306","st7735","st7789"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/funnygeeker.png","metadata":{"files":{"readme":"README.ZH-CN.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-02-24T10:36:36.000Z","updated_at":"2025-04-13T13:55:24.000Z","dependencies_parsed_at":"2024-04-27T05:34:32.912Z","dependency_job_id":null,"html_url":"https://github.com/funnygeeker/micropython-easymenu","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/funnygeeker/micropython-easymenu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnygeeker%2Fmicropython-easymenu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnygeeker%2Fmicropython-easymenu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnygeeker%2Fmicropython-easymenu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnygeeker%2Fmicropython-easymenu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/funnygeeker","download_url":"https://codeload.github.com/funnygeeker/micropython-easymenu/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnygeeker%2Fmicropython-easymenu/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262916575,"owners_count":23383883,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bmp","chinese","english","esp32","esp32-c3","esp32-s3","esp8266","menu","micropython","micropython-easydisplay","pbm","ssd1306","st7735","st7789"],"created_at":"2024-11-10T20:21:20.112Z","updated_at":"2025-07-01T07:04:04.516Z","avatar_url":"https://github.com/funnygeeker.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[English (英语)](./README.md)\n# micropython-easymenu\n- micropython 的简易菜单库，可以通过简单的配置，构造一个菜单\n- 甚至你可以用它来实现一个键盘！！！\n![IMG_20231117_152427](https://github.com/funnygeeker/micropython-easymenu/assets/96659329/2c880f4a-1556-4ba6-b919-eb7874c2ea18)\n![IMG_20240103_171254](https://github.com/funnygeeker/micropython-easymenu/assets/96659329/5fd0e46c-50e4-4441-8dc2-64247ca8383a)\n\n### 已测试的开发板\n- esp32c3, esp32s3, esp01s\n\n#### 已测试的屏幕\n- st7789, st7735, ssd1306\n\n### 软件依赖\n\n#### 必须\n- [micropython-easydisplay](https://github.com/funnygeeker/micropython-easydisplay)\n\n#### 可选\n- [micropython-easybutton](https://github.com/funnygeeker/micropython-easybutton)\n\n### 使用示例\n有关 EasyDisplay 的示例和说明，请前往：[micropython-easydisplay](https://github.com/funnygeeker/micropython-easydisplay)\n\n```python\nfrom machine import SPI, Pin\nfrom driver import st7735_buf\nfrom lib.easydisplay import EasyDisplay\nfrom lib.easymenu import EasyMenu, MenuItem, BackItem, ValueItem, ToggleItem\n\nspi = SPI(1, baudrate=20000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(17))\ndp = st7735_buf.ST7735(width=128, height=128, spi=spi, cs=14, dc=15, res=16, rotate=1, bl=13, invert=False, rgb=False)\ned = EasyDisplay(dp, \"RGB565\", font=\"/text_lite_16px_2312.v3.bmf\", show=True, color=0xFFFF, clear=True)\n\nstatus = True\n\n\ndef get_ip():\n    return \"0.0.0.0\"\n\n\ndef get_status():\n    global status\n    return status\n\n\ndef change_status():\n    global status\n    status = not status\n\n\nmenu = MenuItem(title=('Menu', 'c', 0), layout=[1, 3], spacing=[128, 16])  # 为父菜单指定：标题，布局，选项间隔\n\nmenu1 = MenuItem('Menu-1')  # 设置 Menu-1 菜单的选项\nmenu1.add(ValueItem('Time: ', '123'))\nmenu1.add(ValueItem(('TEST', 'c', 'c')))\nmenu1.add(ToggleItem('Select:', get_status, change_status, value_t='[*]', value_f='[ ]'))\nmenu1.add(BackItem('Back'))\n\nmenu.add(menu1)  # 将选项添加到菜单\nmenu.add(MenuItem('Menu-2'))\nmenu.add(MenuItem(('Menu-3', 5, 0)))\nmenu.add(ValueItem('Status:', 'OK'))\nmenu.add(ValueItem('IP:', (get_ip, 'r', 'c'), skip=True))  # 光标不会指向设为跳过的函数\n\nem = EasyMenu(ed, menu)\nem.show()\n\n# 最后，可以尝试着手动执行一下：\n# em.prev()\n# em.next()\n# em.click()\n# em.next()\n# em.next()\n# em.click()\n# em.back()\n\n# 其他示例代码请访问 /example 文件夹\n\"\"\"\nMenuItem 父菜单设置的参数，子菜单如果不单独设置，则会继承父菜单参数\n\n1. title / value / img 参数：可以传入 tuple, list ,str 或者 函数，主要有以下几种用法：\n    'Menu' # 普通的字符串\n    func # 一个函数，被调用时的返回值将作为显示的内容\n    ('Menu', 0, 0)  # 0 分别为 x轴偏移 和 y轴偏移, 以当前选项的左上角起始位置作为参照\n    ['Menu', 0, 0]\n    (func, 0, 0)\n    [func, 0, 0]\n    (func, 'c', 'c') # 'c' 指 'center', 在当前的选项范围居中显示，注意：只有文字: title / value 支持使用, img 暂不支持\n    ('Menu', 'c', 'c')\n   支持的 align 参数有:\n   X轴: 'l': left, 'r': right, 'c': center\n   Y轴: 't': top, 'b': bottom, 'c': center\n\n2. skip 参数：\n    当该参数为 True 时，该选项不会被框选，而是直接跳过\n\n3. items 参数：\n    传入一个包含 MenuItem, ValueItem 或者 ToggleItem 实例的列表，如果该选项下级存在选项，则该选项会作为菜单，另外也可以通过 MenuItem 实例的\n    add 函数为当前菜单添加项目\n\n4. clear 参数：\n    指定一个屏幕清理区域：(x_start, y_start, x_end, y_end)，当菜单需要更新时，会清理该区域的图像。\n    合理地使用这个参数，可以实现在一个屏幕中同时显示多个菜单\n\n5. parent 参数：\n    该选项的父级菜单实例，如果需要手动设置，可以填入该参数，也可以利用父级菜单的 add 函数来代替\n\n6. start 参数：\n    菜单显示的起点坐标 (x_start, y_start)，从这个位置开始生成选项\n\n7. style 参数，可以通过 style 参数更改默认的菜单样式：\n    title-line: 菜单标题下横线，默认为 1，不启用请设置为 0\n    img-invert: 当该选项被框选时，反转 img 图像的颜色，默认为 0，启用请设置为 1\n    text-invert: 当该选项被框选时，反转 text 文本的颜色，默认为 1，不启用请设置为 0\n    border: 当该选项被框选时，为指定区域生成与背景颜色相反的填充正方形作为文字或图片的背景\n    border-pixel: border 生成后，在 border 的边角的位置，绘制像素点，使 border 表现的更为圆润\n    name: name 参数未设置对齐方式时，默认的对齐方式或者偏移量，默认值为 ['l', 'c']\n    title: title 参数未设置对齐方式时，默认的对齐方式或者偏移量，默认值为 ['c', 't']\n    value: value 参数未设置对齐方式时，默认的对齐方式或者偏移量，默认值为 ['r', 'c'],\n    img: img 参数未设置对齐方式时，默认的对齐方式或者偏移量，默认值为 [0, 0]\n\n8. layout 参数：\n    菜单以每个页面 (x, y) 的布局进行显示\n\n9. spacing 参数：\n    每个选项左上角起始点之间的 (x, y) 距离间隔\n\n10. callback 参数：\n    当 EasyMenu 的 click() 函数被调用的时候，如果当前选项被框选，则会执行的函数\n\n11. data 参数：\n    可以加入一些附加数据，需要时获取，暂时并没有特别的作用\n\"\"\"\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunnygeeker%2Fmicropython-easymenu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffunnygeeker%2Fmicropython-easymenu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunnygeeker%2Fmicropython-easymenu/lists"}