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

99 wiersze
2.4 KiB
Python

# screen_replace.py deemo showing non-stacked screens
# Released under the MIT License (MIT). See LICENSE.
# Copyright (c) 2024 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, ssd
from gui.widgets import Button, CloseButton, Label
from gui.core.writer import CWriter
# Font for CWriter
import gui.fonts.freesans20 as font
from gui.core.colors import *
wri = CWriter(ssd, font, GREEN, BLACK, verbose=False)
# Defining a button in this way enables it to be re-used on
# multiple Screen instances. Note that a Screen class is
# passed, not an instance.
def fwdbutton(wri, row, col, cls_screen, text="Next", args=()):
def fwd(button):
Screen.change(cls_screen, args=args) # Callback
Button(wri, row, col, height=30, callback=fwd, fgcolor=BLACK, bgcolor=GREEN, text=text)
def navbutton(wri, row, col, gen, delta, text):
def nav(button):
cls_screen, num = gen(delta) # gen.send(delta)
Screen.change(cls_screen, mode=Screen.REPLACE, args=(num,)) # Callback
Button(wri, row, col, height=30, callback=nav, fgcolor=BLACK, bgcolor=YELLOW, text=text)
class RingScreen(Screen):
def __init__(self, num):
super().__init__()
Label(wri, 2, 2, f"Ring screen no. {num}.")
navbutton(wri, 40, 2, nav, -1, "Left")
navbutton(wri, 40, 80, nav, 1, "Right")
CloseButton(wri)
# Create a tuple of Screen subclasses (in this case all are identical).
ring = ((RingScreen, 0), (RingScreen, 1), (RingScreen, 2))
# Define a means of navigating between these classes
def navigator():
x = 0
def nav(delta):
nonlocal x
v = x
x = (x + delta) % len(ring)
return ring[x]
return nav
nav = navigator()
# This screen overlays BaseScreen.
class StackScreen(Screen):
def __init__(self):
super().__init__()
Label(wri, 2, 2, "Stacked screen.")
fwdbutton(wri, 40, 2, RingScreen, args=(0,))
CloseButton(wri)
class BaseScreen(Screen):
def __init__(self):
super().__init__()
Label(wri, 2, 2, "Base screen.")
fwdbutton(wri, 40, 2, StackScreen)
CloseButton(wri)
s = """
Demo of screen replace. Screen hierarchy:
Base Screen
|
Stacked Screen
|
<- Ring Screen 0 <-> Ring Screen 1 <-> Ring Screen 2 ->
"""
def test():
print(s)
Screen.change(BaseScreen) # Pass class, not instance!
test()