Make the calculator example keyboard-friendly again

This commit is contained in:
Dave Pearson
2022-10-20 13:38:54 +01:00
parent b18842b46b
commit d7337c343e

View File

@@ -3,6 +3,7 @@ from decimal import Decimal
from textual.app import App, ComposeResult from textual.app import App, ComposeResult
from textual import events from textual import events
from textual.containers import Container from textual.containers import Container
from textual.css.query import NoMatches
from textual.reactive import var from textual.reactive import var
from textual.widgets import Button, Static from textual.widgets import Button, Static
@@ -19,15 +20,13 @@ class CalculatorApp(App):
value = var("") value = var("")
operator = var("plus") operator = var("plus")
KEY_MAP = { NAME_MAP = {
"+": "plus", "asterisk": "multiply",
"-": "minus", "slash": "divide",
".": "point", "underscore": "plus-minus",
"*": "multiply", "plus_minus_sign": "plus-minus",
"/": "divide", "percent_sign": "percent",
"_": "plus-minus", "equals_sign": "equals",
"%": "percent",
"=": "equals",
} }
def watch_numbers(self, value: str) -> None: def watch_numbers(self, value: str) -> None:
@@ -75,7 +74,10 @@ class CalculatorApp(App):
"""Called when the user presses a key.""" """Called when the user presses a key."""
def press(button_id: str) -> None: def press(button_id: str) -> None:
self.query_one(f"#{button_id}", Button).press() try:
self.query_one(f"#{button_id}", Button).press()
except NoMatches:
pass
self.set_focus(None) self.set_focus(None)
key = event.key key = event.key
@@ -84,8 +86,8 @@ class CalculatorApp(App):
elif key == "c": elif key == "c":
press("c") press("c")
press("ac") press("ac")
elif key in self.KEY_MAP: else:
press(self.KEY_MAP[key]) press(self.NAME_MAP.get(key, key))
def on_button_pressed(self, event: Button.Pressed) -> None: def on_button_pressed(self, event: Button.Pressed) -> None:
"""Called when a button is pressed.""" """Called when a button is pressed."""