# 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.label import Label from gui.widgets.buttons import Button, RadioButtons, CloseButton from gui.widgets.listbox import Listbox from gui.widgets.dropdown import Dropdown from gui.widgets.dialog import DialogBox 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()