# lcdMenu A micropython library, which supports vertical and horizontal scrolling through menu items on both 2x16 and 4x20 liquid crystal displays This project is the completely rewritten successor of my old (and now archived) [ProgramChooser](/BlueFox/ProgramChooser) library. It is now production-ready (tested on 2x16 displays only at the moment.) ToDo: Make the README.md also seem production ready! ## Roadmap - [x] forward, backward and select button - [x] support for horizontal and vertical scrolling - [x] support for both 2x16 and 4x20 LCDs - [x] a reliable order of the menu items - [x] good documentation for all of this (maybe through examples) - [x] show an exit screen when a specific exit code is returned by a callback function - [x] make the menu itself exitable (to enable stuff like submenus, etc.) - [x] make the project a valid python package ## Gallery Here are some of examples of how a lcdMenu will look, and to get those, simply append the `Code` column's contents to the following (considering you have the library "installed" as explained before. All the examples below use a 2x16 display. ```python from lcdMenu import lcdMenu from machine import Pin, I2C from PCF8574T import I2C_LCD prev_btn = Pin(13, Pin.IN, Pin.PULL_DOWN) # input of the first btn next_btn = Pin(14, Pin.IN, Pin.PULL_DOWN) # input of the second btn ok_btn = Pin(15, Pin.IN, Pin.PULL_DOWN) # input of switch LCD = I2C_LCD(I2C(0, sda=Pin(8), scl=Pin(9), freq=400000),0x27,2, 16) def first(): print("first() called! 1") def second(): print("second() called! 2") def third(): print("third() called! 3") return True menuItems = [("first item", first), ("second item", second), ("third item", third)] button_mappings = {"prev_btn":prev_btn, "next_btn": next_btn, "ok_btn": ok_btn} ```
Cycling | Title shown | Scroll direction | Initial selection | Result | Code |
---|---|---|---|---|---|
yes | no | vertical | first | menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=True, hide_menu_name=True) menu.setup(menuItems) menu.run() |
|
no | no | vertical | first | menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=True) # <- change of cycle to False! menu.setup(menuItems) menu.run() |
|
no | no | vertical | middle | menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=True menu.setup(menuItems, start_selection=1) # <- change of the initial selection menu.run() |
|
no | no | vertical | last | menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=True) menu.setup(menuItems, start_selection=2) # <- set initial selection to the last element menu.run() |
|
no | yes | vertical | no options (first and last) | menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=False, name="No options!") # now with a title menu.setup([("Only option", lambda: print("Only option chosen!"))]) # now with only one option (ignoring menuItems!) menu.run() |
|
no | yes | vertical | first | menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=False, name="No options!") menu.setup(menuItems) # now with menuItems again menu.run() |
|
no | yes | vertical | middle | menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=False, name="lcdMenu!") menu.setup(menuItems, start_selection=1) # now with an index again menu.run() |
|
no | yes | vertical | last | menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=False, name="lcdMenu!") menu.setup(menuItems, start_selection=2) # <- set initial selection to the last element menu.run() |
|
yes | yes | horizontal | first | menu = lcdMenu(LCD, button_mappings, scroll_direction=True, cycle=True, hide_menu_name=False, name="lcdMenu!") menu.setup(menuItems) menu.run() |