Files
textual/examples/calculator.py
Will McGugan 063595316f style
2021-07-10 21:30:37 +01:00

59 lines
1.8 KiB
Python

from rich.align import Align
from rich.text import Text
from textual.app import App
from textual import events
from textual.view import View
from textual.widgets import Button, Static
from textual.layouts.grid import GridLayout
try:
from pyfiglet import Figlet
except ImportError:
print("Please install pyfiglet to run this example")
font = Figlet(font="small")
class GridTest(App):
async def on_load(self, event: events.Load) -> None:
await self.bind("q,ctrl+c", "quit", "Quit")
async def on_startup(self, event: events.Startup) -> None:
layout = GridLayout(gap=(2, 1), gutter=1, align=("center", "center"))
await self.push_view(View(layout=layout))
layout.add_column("col", max_size=20, repeat=4)
layout.add_row("numbers", min_size=3, max_size=6)
layout.add_row("row", max_size=10, repeat=5)
layout.add_areas(
numbers="col1-start|col4-end,numbers", zero="col1-start|col2-end,row5"
)
def make_text(text: str) -> Text:
return Text(font.renderText(text).rstrip("\n"), style="bold")
def make_button(text: str) -> Button:
label = make_text(text)
return Button(label, style="white on rgb(51,51,51)")
buttons = {
name: make_button(name)
for name in "AC,+/-,%,/,7,8,9,X,4,5,6,-,1,2,3,+,.,=".split(",")
}
for name in ("AC", "+/-", "%"):
buttons[name].style = "black on rgb(165,165,165)"
for name in "/X-+=":
buttons[name].style = "white on rgb(255,159,7)"
zero_text = make_text("0")
layout.place(
*buttons.values(),
numbers=Static(Align.right(zero_text)),
zero=make_button("0"),
)
GridTest.run(title="Calculator Test")