kopia lustrzana https://github.com/peterhinch/micropython-micro-gui
99 wiersze
2.4 KiB
Python
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()
|