# 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()