56 lines
1.3 KiB
Python
56 lines
1.3 KiB
Python
from textual.app import App
|
|
from textual.containers import Vertical
|
|
from textual.reactive import reactive
|
|
from textual.widget import Widget
|
|
from textual.widgets import Input
|
|
|
|
|
|
class WelcomeWidget(Widget):
|
|
who = reactive("World!")
|
|
total = reactive(15)
|
|
|
|
def on_mount(self):
|
|
default_styles = """
|
|
margin: 1;
|
|
padding: 1;
|
|
"""
|
|
self.set_styles(default_styles)
|
|
|
|
def render(self):
|
|
return f":partying_face: Hello, [b red]{self.who}[/]! ({self.total}/15)"
|
|
|
|
def watch_who(self, old_value, new_value):
|
|
self.log(
|
|
f"who attribute changed: old value: {old_value}, "
|
|
f"new value: {new_value} "
|
|
)
|
|
|
|
def compute_total(self):
|
|
return len(self.who)
|
|
|
|
|
|
class InputChangeApp(App):
|
|
def compose(self):
|
|
yield Vertical(
|
|
Input(placeholder="enter your name..."),
|
|
WelcomeWidget(classes="welcome"),
|
|
)
|
|
|
|
def on_input_changed(self, event: Input.Changed) -> None:
|
|
target = self.query_one(".welcome")
|
|
value = event.value
|
|
|
|
if len(value) > 15:
|
|
event.input.value = value[:15]
|
|
return
|
|
|
|
if not value:
|
|
target.who = "World!"
|
|
else:
|
|
target.who = value
|
|
|
|
|
|
if __name__ == '__main__':
|
|
app = InputChangeApp()
|
|
app.run()
|