Skip to content

Commit ad6fd1c

Browse files
committed
Pico Display 2.x: example menus
1 parent c6384ce commit ad6fd1c

File tree

3 files changed

+357
-0
lines changed

3 files changed

+357
-0
lines changed
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# A scrolling menu example
2+
# Use B and Y buttons to navigate LEFT and RIGHT
3+
# Press A to select a character. Selected characters are shown at the top of the display.
4+
# Press X to delete the last character.
5+
6+
import time
7+
from picographics import PicoGraphics, DISPLAY_PICO_DISPLAY_2, PEN_RGB565
8+
from pimoroni import RGBLED
9+
from machine import Pin
10+
11+
button_a = Pin(12, Pin.IN)
12+
button_b = Pin(13, Pin.IN)
13+
button_x = Pin(14, Pin.IN)
14+
button_y = Pin(15, Pin.IN)
15+
16+
display = PicoGraphics(display=DISPLAY_PICO_DISPLAY_2, pen_type=PEN_RGB565, rotate=0)
17+
display.set_backlight(0.8)
18+
19+
# set up constants for drawing
20+
WIDTH, HEIGHT = display.get_bounds()
21+
BLACK = display.create_pen(0, 0, 0)
22+
RED = display.create_pen(255, 0, 0)
23+
GREEN = display.create_pen(0, 255, 0)
24+
BLUE = display.create_pen(0, 0, 255)
25+
WHITE = display.create_pen(255, 255, 255)
26+
PURPLE = display.create_pen(255, 0, 255)
27+
28+
led = RGBLED(26, 27, 28)
29+
30+
31+
class Menu(object):
32+
def __init__(self):
33+
self.items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
34+
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
35+
'y', 'z']
36+
self.selected = 0
37+
self.shadow_offset = 2
38+
self.cursor = "<-"
39+
40+
self.start = 0
41+
self.stop = self.start + 10
42+
self.last_press = 0
43+
self.title = "Scrolling Menu"
44+
45+
self.characters = []
46+
47+
# A function to draw only the menu elements.
48+
# Helps to keep our main draw function tidy!
49+
def draw_menu(self):
50+
display.set_pen(WHITE)
51+
display.clear()
52+
53+
self.slice = self.items[self.start:self.stop]
54+
55+
display.set_pen(BLACK)
56+
length = display.measure_text(self.title, 4)
57+
display.text(self.title, WIDTH // 2 - length // 2 + self.shadow_offset, 10 + self.shadow_offset, WIDTH, 4)
58+
display.set_pen(RED)
59+
display.text(self.title, WIDTH // 2 - length // 2, 10, WIDTH, 4)
60+
61+
display.set_pen(RED)
62+
display.rectangle(5, HEIGHT - 35, 35, 35)
63+
64+
for item in range(len(self.slice)):
65+
if item == 0:
66+
display.set_pen(WHITE)
67+
else:
68+
display.set_pen(BLACK)
69+
70+
display.text(self.slice[item], 15 + item * 30, HEIGHT - 30, WIDTH, 4)
71+
72+
display.set_pen(BLACK)
73+
for i in range(len(self.characters)):
74+
display.text(self.characters[i], 5 + 15 * i, 50, WIDTH, 2)
75+
76+
def remove_last_char(self):
77+
if len(self.characters) > 0:
78+
self.characters.pop()
79+
80+
# Do a thing based on the currently selected menu item
81+
# We're taking the highlighted character and saving it in our array for later.
82+
def process_selected(self):
83+
if len(self.characters) > 20:
84+
self.characters = []
85+
self.characters += self.items[self.selected]
86+
87+
def user_input(self):
88+
89+
# Process the user input and update the currently selected item
90+
if button_y.value() == 0:
91+
if self.selected < len(self.items) - 1:
92+
self.selected += 1
93+
if self.stop < len(self.items) + 9:
94+
self.start += 1
95+
self.stop += 1
96+
else:
97+
self.start = 0
98+
self.stop = self.start + 10
99+
self.selected = 0
100+
101+
if button_b.value() == 0:
102+
if self.selected > 0:
103+
self.selected -= 1
104+
if self.stop > 10:
105+
self.start -= 1
106+
self.stop -= 1
107+
else:
108+
self.start = len(self.items) - 1
109+
self.stop = self.start + 10
110+
self.selected = len(self.items) - 1
111+
112+
if button_a.value() == 0:
113+
self.process_selected()
114+
115+
if button_x.value() == 0:
116+
self.remove_last_char()
117+
118+
119+
menu = Menu()
120+
121+
while True:
122+
123+
menu.draw_menu()
124+
menu.user_input()
125+
126+
display.update()
127+
128+
time.sleep(1.0 / 20)
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# A scrolling menu example
2+
# Use X and Y buttons to navigate up and down the menu
3+
# Press A to select a character. Selected characters are shown at the bottom of the display.
4+
# Press B to delete the last character.
5+
6+
import time
7+
from picographics import PicoGraphics, DISPLAY_PICO_DISPLAY_2, PEN_RGB565
8+
from pimoroni import RGBLED
9+
from machine import Pin
10+
11+
button_a = Pin(12, Pin.IN)
12+
button_b = Pin(13, Pin.IN)
13+
button_x = Pin(14, Pin.IN)
14+
button_y = Pin(15, Pin.IN)
15+
16+
display = PicoGraphics(display=DISPLAY_PICO_DISPLAY_2, pen_type=PEN_RGB565, rotate=0)
17+
display.set_backlight(0.8)
18+
19+
# set up constants for drawing
20+
WIDTH, HEIGHT = display.get_bounds()
21+
BLACK = display.create_pen(0, 0, 0)
22+
RED = display.create_pen(255, 0, 0)
23+
GREEN = display.create_pen(0, 255, 0)
24+
BLUE = display.create_pen(0, 0, 255)
25+
WHITE = display.create_pen(255, 255, 255)
26+
PURPLE = display.create_pen(255, 0, 255)
27+
28+
led = RGBLED(26, 27, 28)
29+
30+
31+
class Menu(object):
32+
def __init__(self):
33+
self.items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
34+
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
35+
'y', 'z']
36+
self.selected = 0
37+
self.shadow_offset = 2
38+
self.cursor = "<-"
39+
40+
self.start = 0
41+
self.stop = self.start + 5
42+
self.last_press = 0
43+
self.title = "Scrolling Menu"
44+
45+
self.characters = []
46+
47+
# A function to draw only the menu elements.
48+
# Helps to keep our main draw function tidy!
49+
def draw_menu(self):
50+
display.set_pen(WHITE)
51+
display.clear()
52+
53+
self.slice = self.items[self.start:self.stop]
54+
55+
display.set_pen(BLACK)
56+
length = display.measure_text(self.title, 4)
57+
display.text(self.title, WIDTH // 2 - length // 2 + self.shadow_offset, 10 + self.shadow_offset, WIDTH, 4)
58+
display.set_pen(BLUE)
59+
display.text(self.title, WIDTH // 2 - length // 2, 10, WIDTH, 4)
60+
61+
for item in range(len(self.slice)):
62+
if item == 0:
63+
display.set_pen(RED)
64+
display.text(self.cursor, 175, 63, WIDTH, 4)
65+
else:
66+
display.set_pen(BLACK)
67+
68+
display.text(self.slice[item], 145, 65 + item * 30, WIDTH, 4)
69+
70+
display.set_pen(BLACK)
71+
for i in range(len(self.characters)):
72+
display.text(self.characters[i], 2 + 12 * i, HEIGHT - 15)
73+
74+
def remove_last_char(self):
75+
if len(self.characters) > 0:
76+
self.characters.pop()
77+
78+
# Do a thing based on the currently selected menu item
79+
# We're taking the highlighted character and saving it in our array for later.
80+
def process_selected(self):
81+
if len(self.characters) > 25:
82+
self.characters = []
83+
self.characters += self.items[self.selected]
84+
85+
def user_input(self):
86+
87+
# Process the user input and update the currently selected item
88+
if button_y.value() == 0:
89+
if self.selected < len(self.items) - 1:
90+
self.selected += 1
91+
if self.stop < len(self.items) + 4:
92+
self.start += 1
93+
self.stop += 1
94+
else:
95+
self.start = 0
96+
self.stop = self.start + 5
97+
self.selected = 0
98+
99+
if button_x.value() == 0:
100+
if self.selected > 0:
101+
self.selected -= 1
102+
if self.stop > 5:
103+
self.start -= 1
104+
self.stop -= 1
105+
else:
106+
self.start = len(self.items) - 1
107+
self.stop = self.start + 5
108+
self.selected = len(self.items) - 1
109+
110+
if button_a.value() == 0:
111+
self.process_selected()
112+
113+
if button_b.value() == 0:
114+
self.remove_last_char()
115+
116+
117+
menu = Menu()
118+
119+
while True:
120+
121+
menu.draw_menu()
122+
menu.user_input()
123+
124+
display.update()
125+
126+
time.sleep(1.0 / 20)
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import time
2+
from picographics import PicoGraphics, DISPLAY_PICO_DISPLAY_2, PEN_RGB565
3+
from pimoroni import RGBLED
4+
from machine import Pin
5+
6+
button_a = Pin(12, Pin.IN)
7+
button_x = Pin(14, Pin.IN)
8+
button_y = Pin(15, Pin.IN)
9+
10+
display = PicoGraphics(display=DISPLAY_PICO_DISPLAY_2, pen_type=PEN_RGB565, rotate=0)
11+
display.set_backlight(0.8)
12+
13+
# set up constants for drawing
14+
WIDTH, HEIGHT = display.get_bounds()
15+
BLACK = display.create_pen(0, 0, 0)
16+
RED = display.create_pen(255, 0, 0)
17+
GREEN = display.create_pen(0, 255, 0)
18+
BLUE = display.create_pen(0, 0, 255)
19+
WHITE = display.create_pen(255, 255, 255)
20+
PURPLE = display.create_pen(255, 0, 255)
21+
22+
led = RGBLED(26, 27, 28)
23+
24+
25+
class Menu(object):
26+
def __init__(self):
27+
self.items = ["Red", "Green", "Blue", "Purple"]
28+
self.selected = 0
29+
self.shadow_offset = 2
30+
self.cursor = "<-"
31+
self.colour = BLACK
32+
self.title = "Simple Menu"
33+
34+
# A function to draw only the menu elements.
35+
def draw_menu(self):
36+
display.set_pen(WHITE)
37+
display.clear()
38+
display.set_pen(BLACK)
39+
length = display.measure_text(self.title, 4)
40+
display.text(self.title, WIDTH // 2 - length // 2 + self.shadow_offset, 10 + self.shadow_offset, WIDTH, 4)
41+
display.set_pen(self.colour)
42+
display.text(self.title, WIDTH // 2 - length // 2, 10, WIDTH, 4)
43+
44+
display.set_pen(BLACK)
45+
for item in range(len(self.items)):
46+
length = display.measure_text(self.items[item], 3)
47+
if self.selected == item:
48+
display.set_pen(self.colour)
49+
display.text(self.cursor, length + 40, HEIGHT // 2 + item * 20, WIDTH, 3)
50+
51+
display.text(self.items[item], 30, HEIGHT // 2 + item * 20, WIDTH, 3)
52+
53+
display.set_pen(self.colour)
54+
display.rectangle(0, HEIGHT - 10, WIDTH, 10)
55+
display.set_pen(BLACK)
56+
57+
# Do a thing based on the currently selected menu item
58+
# For our example we'll be changing the text and LED colour
59+
def process_selected(self):
60+
if self.selected == 0:
61+
self.colour = RED
62+
led.set_rgb(255, 0, 0)
63+
64+
if self.selected == 1:
65+
self.colour = GREEN
66+
led.set_rgb(0, 255, 0)
67+
68+
if self.selected == 2:
69+
self.colour = BLUE
70+
led.set_rgb(0, 0, 255)
71+
72+
if self.selected == 3:
73+
self.colour = PURPLE
74+
led.set_rgb(255, 0, 255)
75+
76+
def user_input(self):
77+
# Process the user input and update the currently selected item
78+
if button_y.value() == 0:
79+
if self.selected + 1 < len(self.items):
80+
self.selected += 1
81+
else:
82+
self.selected = 0
83+
84+
if button_x.value() == 0:
85+
if self.selected > 0:
86+
self.selected -= 1
87+
else:
88+
self.selected = len(self.items) - 1
89+
90+
if button_a.value() == 0:
91+
self.process_selected()
92+
93+
94+
menu = Menu()
95+
96+
while True:
97+
98+
menu.draw_menu()
99+
menu.user_input()
100+
101+
display.update()
102+
103+
time.sleep(1.0 / 20)

0 commit comments

Comments
 (0)