Kas tai per žvėris – Textual?
Jei kada nors pagalvojote, kad terminalo aplikacijos turi atrodyti kaip iš 1985-ųjų su savo ASCII simboliais ir žaliu tekstu ant juodo fono, turiu jums naujienų. Python Textual biblioteka atėjo parodyti, kad TUI (Terminal User Interface) gali būti ne tik funkcionalus, bet ir gražus, moderniškas, o svarbiausia – lengvai sukuriamas.
Textual – tai Python framework’as, skirtas kurti interaktyvias terminalo aplikacijas. Ne, ne tas pats kaip curses ar ncurses, kuriuos prisimenant daugeliui kyla šiurpas. Čia viskas padaryta žmogiškai: CSS stilizavimas, reaktyvus dizainas, komponentų sistema. Taip, teisingai supratote – CSS terminale! Kas galėjo pagalvoti, kad tai kada nors taps realybe?
Bibliotekos kūrėjas Will McGugan (tas pats, kuris sukūrė populiarią Rich biblioteką) padarė tai, ko daugelis net nedrįso svajoti. Jis paėmė terminalą ir pavertė jį šiuolaikine UI platformą. Rezultatas? Galite kurti aplikacijas, kurios atrodo tarsi būtų web’e, bet veikia grynai terminale ir nereikalauja jokio naršyklės ar X serverio.
Kodėl apskritai rūpintis terminalo UI?
Geras klausimas. Gyvename 2024-aisiais, turime Electron aplikacijas, web framework’us, mobilias platformas. Kam dar viena UI technologija, dar ir terminale?
Atsakymas paprastas: efektyvumas ir universalumas. Terminalo aplikacijos veikia bet kur – serveriuose be GUI, per SSH prisijungus, Docker konteineriuose, Raspberry Pi. Jos naudoja minimalius resursus, paleidžiamos akimirksniu ir nepriklausomos nuo desktop aplinkos.
Plius, jei dirbate su DevOps įrankiais, sistemų administravimu ar duomenų analize, terminale praleidžiate nemažai laiko. Kodėl gi nepadaryti tų įrankių gražesnių ir patogesnių? Textual leidžia kurti aplikacijas su pilnaverčiais meniu, formomis, lentelėmis, net animacijomis – visa tai terminale.
Dar vienas aspektas – prieigos galimybės. TUI aplikacijos puikiai veikia su screen reader’iais ir kitomis pagalbinėmis technologijomis. Tai ne visada galima pasakyti apie modernias web aplikacijas su jų JavaScript kalnu.
Pirmieji žingsniai su Textual
Pradėti naudoti Textual tikrai nesudėtinga. Viskas prasideda nuo įprastos instaliacijos per pip:
pip install textual textual-dev
Textual-dev paketas nėra būtinas, bet jame rasite naudingų development įrankių, įskaitant live reload funkciją, kuri automatiškai perkrauna aplikaciją kai keičiate kodą. Tikrai praverčia kuriant.
Paprasčiausia Textual aplikacija atrodo maždaug taip:
from textual.app import App
class MyApp(App):
def compose(self):
yield Label("Labas, Textual!")
if __name__ == "__main__":
app = MyApp()
app.run()
Taip, tiek. Paleidus šį kodą, terminale pamatysite pilnai veikiančią aplikaciją su tekstu. Ne itin įspūdinga, bet tai tik pradžia.
Kas iš tikrųjų įdomu – tai kaip Textual naudoja reaktyvų programavimo modelį. Jei kada dirbote su React ar Vue.js, daug kas atrodys pažįstama. Komponentai, būsenos valdymas, lifecycle metodai – visa tai čia yra, tik pritaikyta terminalui.
Komponentai ir jų galimybės
Textual ateina su solidžia įmontuotų komponentų (widgets) kolekcija. Turite mygtukus (Button), įvesties laukus (Input), teksto sritis (TextArea), lentelės (DataTable), medžio struktūras (Tree), ir dar daugybę kitų. Kiekvienas komponentas yra pilnai funkcionali UI dalis, kurią galite tiesiog įterpti į savo aplikaciją.
Pavyzdžiui, norite sukurti formą su keliais įvesties laukais? Nesudėtinga:
from textual.app import App, ComposeResult
from textual.widgets import Input, Button, Label
from textual.containers import Container
class FormApp(App):
def compose(self) -> ComposeResult:
yield Container(
Label("Vardas:"),
Input(placeholder="Įveskite vardą"),
Label("El. paštas:"),
Input(placeholder="Įveskite el. paštą"),
Button("Siųsti", variant="primary")
)
def on_button_pressed(self, event):
self.notify("Forma išsiųsta!")
Kas čia įdomiausia – komponentai automatiškai tvarko fokusą, klaviatūros navigaciją, pelės įvykius. Jums nereikia rūpintis low-level detalėmis. Tiesiog aprašote, ką norite matyti, o Textual pasirūpina viskuo kitu.
DataTable komponentas yra ypač galingas. Jis gali rodyti tūkstančius eilučių, palaikyti rūšiavimą, filtravimą, net virtualų scrolling’ą. Viskas veikia sklandžiai ir greitai, net su dideliais duomenų kiekiais.
CSS terminale – ar tai ne beprotybė?
Kai pirma kart išgirdau apie CSS terminale, pagalvojau, kad tai juokas. Bet Textual komanda padarė tai ne tik veikiančia, bet ir prasmingą. Jų CSS implementacija nėra pilnas web CSS, bet paima geriausias jo dalis ir pritaiko terminalo kontekstui.
Galite naudoti selektorius, klases, ID, net pseudo-klases kaip `:hover` ar `:focus`. Stilius aprašomas atskirame faile arba tiesiog Python klasės atribute:
class MyApp(App):
CSS = """
Button {
width: 100%;
margin: 1;
background: $primary;
}
Button:hover {
background: $primary-lighten-1;
}
Input {
border: solid $accent;
margin-bottom: 1;
}
"""
Textual palaiko spalvų temas, kintamuosius, net responsive dizainą su media queries. Taip, galite padaryti savo terminalo aplikaciją, kuri prisitaiko prie terminalo dydžio. Tai ypač naudinga, kai aplikacija naudojama įvairiuose ekranuose – nuo mažų 80×24 terminalų iki didelių 4K monitorių.
Layout sistema taip pat pasiskolinta iš web pasaulio. Turite Flexbox-o pagrindais veikiantį išdėstymą, grid’us, konteinerius. Galite centruoti elementus, daryti stulpelius, eilutes – visa tai be jokių sudėtingų skaičiavimų.
Reaktyvumas ir būsenos valdymas
Vienas iš stipriausių Textual aspektų – reaktyvus programavimo modelis. Biblioteka naudoja reactive atributus, kurie automatiškai atnaujina UI, kai pasikeičia duomenys.
Štai pavyzdys:
from textual.reactive import reactive
class Counter(Widget):
count = reactive(0)
def watch_count(self, old_value, new_value):
self.update(f"Skaičius: {new_value}")
def on_click(self):
self.count += 1
Kai `count` pasikeičia, `watch_count` metodas automatiškai iškviečiamas, ir UI atsinaujina. Nereikia rankiniu būdu valdyti būsenos ir UI sinchronizacijos – Textual tai daro už jus.
Tai labai primena React hooks ar Vue reactive properties. Jei esate susipažinę su šiais framework’ais, Textual reaktyvumas atrodys natūralus. Jei ne – tai puiki proga išmokti šį programavimo stilių, kuris tampa vis populiaresnis.
Textual taip pat turi message passing sistemą, kuri leidžia komponentams komunikuoti tarpusavyje. Kiekvienas įvykis (click, keyboard press, focus change) yra message, kurį galite pertvarkti ir apdoroti. Tai sukuria labai aiškią ir prižiūrimą kodo struktūrą.
Debugging ir development įrankiai
Viena iš didžiausių TUI kūrimo problemų visada buvo debugging’as. Kaip debuginti aplikaciją, kuri užima visą terminalą? Kur matyti print() išvestį? Textual turi atsakymą.
Textual console – tai atskirame terminalo lange veikiantis debugging įrankis. Jis rodo visus log’us, event’us, net leidžia inspektuoti DOM struktūrą (taip, Textual turi DOM!). Paleidžiate jį su:
textual console
Tada savo aplikacijoje galite naudoti `self.log()` ir visi pranešimai atsiras console lange. Tai neįtikėtinai patogu, ypač kai derinsite sudėtingas sąveikas ar layout problemas.
Dar yra `textual run –dev` režimas, kuris įjungia hot reload. Pakeičiate Python failą ar CSS – aplikacija automatiškai perkraunama. Tai gali atrodyti smulkmena, bet vystant aplikaciją tai sutaupo daugybę laiko.
Textual taip pat turi borders ir keys debug režimus, kurie vizualiai parodo komponentų ribas ir aktyvius klavišų binding’us. Labai naudinga, kai bandote suprasti, kodėl kažkas neveikia kaip tikėjotės.
Realūs panaudojimo atvejai
Gerai, bet kam visa tai praktikoje? Textual puikiai tinka kelių tipų aplikacijoms.
Pirma, DevOps įrankiai. Jei kuriate CLI įrankį Kubernetes klasteriams valdyti, log’ams analizuoti ar deployment’ams monitorinti, Textual leidžia padaryti tai su pilnaverčiu UI. Vietoj paprastos komandų eilutės, galite turėti interaktyvų dashboard’ą su real-time atnaujinimais.
Antra, duomenų analizės įrankiai. Jei dirbate su dideliais duomenų rinkiniais per SSH prisijungę prie serverio, Textual leidžia sukurti interaktyvius duomenų naršyklus, filtrus, vizualizacijas – visa tai terminale, be jokio GUI.
Trečia, sisteminiai monitoriai ir dashboard’ai. Panašiai kaip htop ar btop, bet su savo specifine logika. Galite monitorinti bet ką – serverius, aplikacijas, IoT įrenginius.
Ketvirta, interaktyvūs konfigūracijos įrankiai. Vietoj to, kad prašytumėte vartotojų redaguoti YAML ar JSON failus, galite sukurti gražią formą su validacija, pagalba ir preview.
Aš pats naudojau Textual sukurti git commit’ų naršyklę su interaktyviu diff viewer’iu. Veikia žymiai greičiau nei bet koks GUI įrankis ir galiu naudoti per SSH. Kitas projektas buvo log analizės įrankis, kuris real-time rodo log’us su filtravimo ir highlight’inimo galimybėmis.
Kas toliau ir ką reikėtų žinoti
Textual vis dar aktyviai vystomas. Biblioteka pasiekė 1.0 versiją, kas reiškia stabilų API, bet naujos funkcijos vis dar pridedamos. Community auga, dokumentacija gerėja, pavyzdžių daugėja.
Ar yra trūkumų? Žinoma. Textual reikalauja gana naujos Python versijos (3.8+), o idealiai 3.11+. Jei dirbate su legacy sistemomis, tai gali būti problema. Taip pat, nors biblioteka optimizuota, labai sudėtingi UI su šimtais komponentų gali būti šiek tiek lėtesni nei norėtųsi.
Performance paprastai nėra problema, bet jei kuriate kažką panašaus į IDE ar labai sudėtingą aplikaciją su tūkstančiais elementų, gali tekti pagalvoti apie optimizaciją. Laimei, Textual turi lazy loading, virtualizaciją ir kitus įrankius, padedančius susidoroti su performance iššūkiais.
Dar vienas dalykas – terminalų įvairovė. Ne visi terminalai palaiko visas funkcijas vienodai. Textual daro gerą darbą abstraktuojant skirtumus, bet kartais gali susidurti su keistomis problemomis specifiniuose terminaluose. Geriausiai veikia moderniuose terminaluose kaip iTerm2, Windows Terminal, Alacritty.
Jei planuojate rimtai naudoti Textual, rekomenduoju išstudijuoti oficialią dokumentaciją – ji tikrai gera. Taip pat pažiūrėkite į Textual pavyzdžių galeriją GitHub’e. Ten rasite įvairių aplikacijų, nuo paprastų iki labai sudėtingų, kurias galite naudoti kaip atskaitos tašką.
Bendruomenė daugiausia gyvuoja Discord serveryje, kur kūrėjai ir vartotojai dalijasi patarimais, sprendžia problemas ir diskutuoja apie naujoves. Jei įstrigsite, ten tikrai gausite pagalbos.
Textual atveria duris į naują TUI kūrimo erą. Tai ne tik funkcionalus įrankis, bet ir malonumas naudoti. Jei kada svajojote sukurti gražią terminalo aplikaciją, bet atrodė per sudėtinga – dabar pats laikas pamėginti. Python žinios ir šiek tiek entuziazmo – to pakanka pradėti. O rezultatai gali būti tikrai įspūdingi.
