111 lines
3.3 KiB
Python
Executable file
111 lines
3.3 KiB
Python
Executable file
"""
|
|
PyPortal Calculator Demo
|
|
"""
|
|
import time
|
|
import board
|
|
import displayio
|
|
import os
|
|
from collections import namedtuple
|
|
from adafruit_display_text.label import Label
|
|
from adafruit_bitmap_font import bitmap_font
|
|
from adafruit_display_shapes.rect import Rect
|
|
from adafruit_button import Button
|
|
from calculator import Calculator
|
|
import adafruit_touchscreen
|
|
coords = namedtuple("Point", "x y")
|
|
|
|
ts = adafruit_touchscreen.Touchscreen(board.TOUCH_XL, board.TOUCH_XR,
|
|
board.TOUCH_YD, board.TOUCH_YU,
|
|
calibration=((5200, 59000), (5800, 57000)),
|
|
size=(320, 240))
|
|
|
|
# Settings
|
|
BUTTON_WIDTH = 60
|
|
BUTTON_HEIGHT = 30
|
|
BUTTON_MARGIN = 8
|
|
MAX_DIGITS = 29
|
|
BLACK = 0x0
|
|
ORANGE = 0xFF8800
|
|
WHITE = 0xFFFFFF
|
|
GRAY = 0x888888
|
|
LABEL_OFFSET = 290
|
|
|
|
# Make the display context
|
|
calc_group = displayio.Group(max_size=25)
|
|
board.DISPLAY.show(calc_group)
|
|
|
|
# Make a background color fill
|
|
color_bitmap = displayio.Bitmap(320, 240, 1)
|
|
color_palette = displayio.Palette(1)
|
|
color_palette[0] = GRAY
|
|
bg_sprite = displayio.TileGrid(color_bitmap,
|
|
pixel_shader=color_palette,
|
|
x=0, y=0)
|
|
calc_group.append(bg_sprite)
|
|
|
|
# Load the font
|
|
font = bitmap_font.load_font("/fonts/Arial-12.bdf")
|
|
buttons = []
|
|
|
|
# Some button placement functions
|
|
def button_grid(row, col):
|
|
return coords(BUTTON_MARGIN * (row + 1) + BUTTON_WIDTH * row + 20,
|
|
BUTTON_MARGIN * (col + 1) + BUTTON_HEIGHT * col + 40)
|
|
|
|
def make_button(row, col, label, width=1, color=WHITE, text_color=BLACK):
|
|
pos = button_grid(row, col)
|
|
button = Button(x=pos.x, y=pos.y,
|
|
width=BUTTON_WIDTH * width + BUTTON_MARGIN * (width - 1), height=BUTTON_HEIGHT,
|
|
label=label, label_font=font, label_color=text_color, fill_color=color,
|
|
style=Button.ROUNDRECT)
|
|
buttons.append(button)
|
|
return button
|
|
|
|
border = Rect(20, 8, 280, 35, fill=WHITE, outline=BLACK, stroke=2)
|
|
calc_display = Label(font, text="0", color=BLACK, max_glyphs=MAX_DIGITS)
|
|
calc_display.y = 25
|
|
|
|
clear_button = make_button(0, 0, "AC")
|
|
make_button(1, 0, "+/-")
|
|
make_button(2, 0, "%")
|
|
make_button(3, 0, "/", 1, ORANGE, WHITE)
|
|
make_button(0, 1, "7")
|
|
make_button(1, 1, "8")
|
|
make_button(2, 1, "9")
|
|
make_button(3, 1, "x", 1, ORANGE, WHITE)
|
|
make_button(0, 2, "4")
|
|
make_button(1, 2, "5")
|
|
make_button(2, 2, "6")
|
|
make_button(3, 2, "-", 1, ORANGE, WHITE)
|
|
make_button(0, 3, "1")
|
|
make_button(1, 3, "2")
|
|
make_button(2, 3, "3")
|
|
make_button(3, 3, "+", 1, ORANGE, WHITE)
|
|
make_button(0, 4, "0", 2)
|
|
make_button(2, 4, ".")
|
|
make_button(3, 4, "=", 1, ORANGE, WHITE)
|
|
|
|
# Add the display and buttons to the main calc group
|
|
calc_group.append(border)
|
|
calc_group.append(calc_display)
|
|
for b in buttons:
|
|
calc_group.append(b.group)
|
|
|
|
calculator = Calculator(calc_display, clear_button, LABEL_OFFSET)
|
|
|
|
button = ""
|
|
while True:
|
|
point = ts.touch_point
|
|
if point is not None:
|
|
for i, b in enumerate(buttons):
|
|
if b.contains(point) and button == "":
|
|
b.selected = True
|
|
button = b.label
|
|
time.sleep(0.1)
|
|
b.selected = False
|
|
break
|
|
else:
|
|
if button != "":
|
|
calculator.add_input(button)
|
|
button = ""
|
|
time.sleep(0.05)
|