micropython-micro-gui/gui/demos/screens.py

110 wiersze
4.0 KiB
Python

# screens.py micro-gui demo of multiple screens, dropdowns etc
# Released under the MIT License (MIT). See LICENSE.
# Copyright (c) 2021 Peter Hinch
# hardware_setup must be imported before other modules because of RAM use.
import hardware_setup # Create a display instance
from gui.core.ugui import Screen, Window, ssd
from gui.widgets import Button, RadioButtons, CloseButton, Listbox, Dropdown, DialogBox, Label
from gui.core.writer import CWriter
# Font for CWriter
import gui.fonts.arial10 as arial10
from gui.core.colors import *
# Note that litcolor is defeated by design, because the callback's action
# is to change the screen currency. This tests the bugfix.
def fwdbutton(writer, row, col, cls_screen, text, color, *args, **kwargs):
def fwd(button):
Screen.change(cls_screen, args = args, kwargs = kwargs)
Button(writer, row, col, callback = fwd, bgcolor = color, litcolor = YELLOW,
text = text, textcolor = WHITE, shape = CLIPPED_RECT)
# Demo of creating a dialog manually
class UserDialogBox(Window):
def __init__(self, writer, callback, args):
def back(button, text):
Window.value(text)
callback(Window, *args)
Screen.back()
def close_cb(button, text):
Window.value(text)
callback(Window, *args)
height = 80
width = 150
super().__init__(20, 20, height, width, bgcolor = DARKGREEN)
row = self.height - 30
# .locn converts Window relative row, col to absolute row, col
Button(writer, *self.locn(row, 20), height = 20, width = 50, textcolor = BLACK, bgcolor = RED,
text = 'Cat', callback = back, args = ('Cat',))
Button(writer, *self.locn(row, 80), height = 20, width = 50, textcolor = BLACK, bgcolor = GREEN,
text = 'Dog', callback = back, args = ('Dog',))
CloseButton(writer, callback=close_cb, args = ('Close',))
# Minimal screen change example
class Overlay(Screen):
def __init__(self):
super().__init__()
wri = CWriter(ssd, arial10, GREEN, BLACK, verbose=False)
Label(wri, 20, 20, 'Screen overlays base')
CloseButton(wri)
class BaseScreen(Screen):
def __init__(self):
def lbcb(lb):
print('Listbox', lb.textvalue())
def ddcb(dd):
print('Dropdown', tv := dd.textvalue())
if tv == 'new screen':
Screen.change(Overlay)
def dbcb(window, label):
label.value('Auto Dialog: {}'.format(window.value()))
def udbcb(window, label):
label.value('User Dialog: {}'.format(window.value()))
super().__init__()
wri = CWriter(ssd, arial10, GREEN, BLACK, verbose=False)
col = 2
row = 2
Listbox(wri, row, col, callback=lbcb,
elements = ('cat', 'dog', 'aardvark', 'goat', 'pig', 'mouse'),
bdcolor = GREEN, bgcolor = DARKGREEN,
also = Listbox.ON_LEAVE)
col = 70
Dropdown(wri, row, col, callback=ddcb,
elements = ('hydrogen', 'helium', 'neon', 'xenon', 'new screen'),
bdcolor = GREEN, bgcolor = DARKGREEN)
row += 30
lbl = Label(wri, row, col, 'Result from dialog box.')
row += 20
dialog_elements = (('Yes', GREEN), ('No', RED), ('Foo', YELLOW))
# 1st 6 args are for fwdbutton
fwdbutton(wri, row, col, DialogBox, 'Dialog', RED,
# Args for DialogBox constructor
wri, elements = dialog_elements, label = 'Test dialog', callback = dbcb, args = (lbl,))
col += 60
fwdbutton(wri, row, col, UserDialogBox, 'User', BLUE,
# Args for UserDialogBox constructor
wri, udbcb, (lbl,))
CloseButton(wri) # Quit the application
def test():
if ssd.height < 128 or ssd.width < 240:
print('This test requires a display of at least 240x128 pixels.')
else:
print('Testing micro-gui...')
Screen.change(BaseScreen)
test()