Kas yra Textual ir kam jo reikia?
Kai pagalvojame apie vartotojo sąsajas, dažniausiai į galvą šauna arba tradicinės grafinės aplikacijos su langais ir mygtukais, arba modernios web aplikacijos su CSS ir JavaScript. Bet yra dar viena kategorija, kuri pastaruoju metu išgyvena tikrą renesansą – TUI arba Terminal User Interface aplikacijos.
Textual yra Python biblioteka, kuri leidžia kurti sudėtingas, interaktyvias terminalų sąsajas su minimaliu kodo kiekiu. Jei kada nors naudojotės tokiais įrankiais kaip htop, midnight commander ar lazygit, tai jau matėte TUI aplikacijas veikime. Jos atrodo šiuolaikiškai, reaguoja į pelės paspaudimus, turi spalvas, animacijas ir net CSS-panašų stilizavimą – visa tai terminale!
Kodėl tai aktualu? Pirma, ne visos užduotys reikalauja pilnavertės GUI. Antra, TUI aplikacijos puikiai veikia per SSH, neapkrauna sistemos resursų ir atrodo profesionaliai. Trečia, su Textual galite sukurti tokią aplikaciją per kelias valandas, o ne savaites.
Pirmieji žingsniai su Textual
Pradėti su Textual yra paprasta kaip ir su bet kuria kita Python biblioteka. Įdiekite per pip:
pip install textual textual-dev
Pastarasis paketas – textual-dev – suteikia puikų įrankį, kuris leidžia matyti jūsų aplikacijos išvaizdą realiu laiku kol rašote kodą. Tai kaip hot-reload web kūrime, tik terminale.
Pats paprasčiausias Textual pavyzdys atrodo taip:
from textual.app import App
class MyApp(App):
def compose(self):
yield Label("Labas, Textual!")
if __name__ == "__main__":
MyApp().run()
Paleiskite šį kodą ir pamatysite pilnai funkcionuojančią terminalų aplikaciją. Galbūt ji dar nieko ypatingo nedaro, bet jau turi visą Textual infrastruktūrą – galite naudoti klaviatūros trumpinius, aplikacija reaguoja į terminalo dydžio keitimą, turi tinkamą išėjimo mechanizmą.
Kas įdomu – compose() metodas yra pagrindinis būdas, kaip aprašote savo aplikacijos struktūrą. Jis veikia kaip generatorius, kuris „išduoda” komponentus. Tai gana elegantiškas sprendimas, leidžiantis lengvai kurti hierarchines struktūras.
Widgetai ir jų ekosistema
Textual ateina su solidžia įmontuotų widgetų kolekcija. Turite mygtukus, įvesties laukus, lenteles, medžius, korteles, tabuliacijas ir dar daugiau. Kiekvienas widgetas yra gerai apgalvotas ir turi daug konfigūracijos galimybių.
Pavyzdžiui, norite sukurti formą su keliais laukais? Nėra problemų:
from textual.app import App
from textual.widgets import Input, Button, Static
from textual.containers import Container
class FormApp(App):
def compose(self):
yield Container(
Static("Prisijungimo forma", classes="title"),
Input(placeholder="Vartotojo vardas", id="username"),
Input(placeholder="Slaptažodis", password=True, id="password"),
Button("Prisijungti", variant="primary"),
)
Kas čia vyksta? Sukūrėme konteinerį, į kurį įdėjome kelis widgetus. Static yra paprastas tekstinis elementas, Input – įvesties laukas (pastebėkite password=True parametrą), o Button – mygtukas su pirminiu stiliumi.
Bet tikroji magija prasideda, kai pradedate dirbti su įvykiais. Kiekvienas widgetas gali siųsti įvykius, į kuriuos galite reaguoti. Pavyzdžiui, mygtuko paspaudimas:
def on_button_pressed(self, event: Button.Pressed) -> None:
username = self.query_one("#username").value
password = self.query_one("#password").value
# Darome kažką su duomenimis
query_one() metodas veikia panašiai kaip CSS selektoriai – galite ieškoti elementų pagal ID, klases ar tipus. Tai labai intuityvus būdas pasiekti reikiamus komponentus.
CSS terminale? Taip, rimtai!
Vienas labiausiai stebinančių Textual aspektų yra tai, kad stilizavimui naudojamas CSS-panašus sintaksė. Ne, tai nėra tikras CSS, bet koncepcija labai panaši. Galite kurti atskirą .tcss failą arba aprašyti stilius tiesiog Python kode.
Pavyzdys:
Screen {
background: $surface;
}
.title {
width: 100%;
content-align: center middle;
text-style: bold;
color: $accent;
padding: 1;
}
Button {
margin: 1 2;
}
Button.primary {
background: $primary;
color: $text;
}
Matote? Layout’ai, spalvos, tarpai, teksto stiliai – viskas veikia. Textual palaiko flexbox-panašią išdėstymo sistemą, kuri leidžia kurti sudėtingus išdėstymus be galvos skausmo. Galite naudoti dock, grid, horizontal ir vertical išdėstymus.
Spalvų temos taip pat yra įmontuotos. Textual ateina su keliomis paruoštomis temomis, ir galite lengvai sukurti savo. Sistemos kintamieji kaip $primary, $surface, $accent automatiškai prisitaiko prie pasirinktos temos.
Reaktyvumas ir būsenos valdymas
Modernios aplikacijos turi būti reaktyvios – kai pasikeičia duomenys, sąsaja turėtų atsinaujinti automatiškai. Textual turi tam puikų mechanizmą vadinamą „reactive” atributais.
from textual.reactive import reactive
class CounterApp(App):
count = reactive(0)
def compose(self):
yield Static(id="counter")
yield Button("Padidinti")
def watch_count(self, new_value: int) -> None:
self.query_one("#counter").update(f"Skaičius: {new_value}")
def on_button_pressed(self) -> None:
self.count += 1
Kas čia įdomu? count yra reaktyvus atributas. Kai jis pasikeičia, automatiškai iškviečiamas watch_count() metodas. Tai panašu į Vue.js ar React hooks, tik Python pasaulyje.
Galite turėti kiek norite reaktyvių atributų, ir jie gali priklausyti vienas nuo kito. Textual pasirūpins, kad viskas būtų atnaujinta tinkama tvarka ir be bereikalingų perpiešimų.
Dar vienas galingas įrankis – data binding. Galite susieti widgetų savybes su aplikacijos būsena, ir viskas sinchronizuosis automatiškai. Tai labai sumažina boilerplate kodo kiekį.
Realūs panaudojimo atvejai
Gerai, bet kam to reikia realiame gyvenime? Štai keletas scenarijų, kur Textual tikrai spindi:
DevOps įrankiai – jei kuriate CLI įrankius serverių administravimui, deployment’ui ar monitoring’ui, TUI sąsaja gali būti daug patogesnė už paprastą teksto išvestį. Galite rodyti realaus laiko statistiką, logus, leisti interaktyviai valdyti procesus.
Duomenų analizės dashboardai – nereikia kurti pilnavertės web aplikacijos, kad parodytumėte keletą grafikų ir lentelių. Textual turi puikų DataTable widgetą, kuris gali rodyti tūkstančius eilučių su filtravimo ir rūšiavimo galimybėmis.
Konfigūracijos valdymas – vietoj to, kad versti vartotojus redaguoti JSON ar YAML failus rankiniu būdu, galite sukurti interaktyvią formą su validacija ir pagalba.
Testavimo įrankiai – jei kuriate automatizuotus testus, TUI sąsaja gali padėti stebėti progresą, peržiūrėti rezultatus ir net interaktyviai debuginti.
Vienas įdomus pavyzdys – posting aplikacija, kuri yra pilnavertis API testavimo įrankis (kaip Postman, tik terminale). Ji sukurta su Textual ir rodo, ką galima pasiekti su šia biblioteka – turi tabuliacijas, sintaksės paryškinimą, istorijos valdymą ir dar daug ko.
Performance ir optimizacija
Terminalų aplikacijos turi būti greitos. Niekas nenori lėto UI, net jei jis terminale. Textual yra optimizuotas našumui – jis perpiešia tik tai, kas pasikeitė, naudoja efektyvius algoritmus layout’ams skaičiuoti ir turi minimalų overhead’ą.
Bet vis tiek galite susidūrti su našumo problemomis, jei neatsargiai. Keletas patarimų:
Venkite dažnų pilno ekrano atnaujinimų. Jei rodote realaus laiko duomenis, atnaujinkite tik tuos widgetus, kuriems tai reikia. Naudokite update() metodus, o ne perkurkite visą medį.
Didelėms duomenų lentelėms naudokite virtualizaciją. DataTable widgetas tai daro automatiškai, bet jei kuriate savo sprendimus, turėkite omenyje, kad terminale nėra prasmės renderinti 10000 eilučių – vartotojas vis tiek mato tik 50.
Sunkius skaičiavimus darykite atskirame thread’e arba async funkcijose. Textual puikiai palaiko asyncio, ir galite lengvai integruoti asinchroninius procesus:
async def on_mount(self) -> None:
self.set_interval(1, self.update_stats)
async def update_stats(self) -> None:
data = await fetch_data_from_api()
self.query_one("#stats").update(data)
Debugging ir kūrimo įrankiai
Vienas iš didžiausių iššūkių kuriant TUI aplikacijas – debugging. Negalite tiesiog print() į terminalą, nes jūsų aplikacija jį užima. Bet Textual komanda pagalvojo apie tai.
textual console komanda paleidžia atskirą konsolę, kuri rodo visus jūsų aplikacijos logus. Galite naudoti standartinį Python logging modulį, ir viskas atsiras toje konsolėje.
Dar geriau – textual run --dev paleidžia jūsų aplikaciją development režime su papildomomis debugging galimybėmis. Galite matyti widgetų medį, jų savybes, CSS stilius ir net keisti juos realiu laiku.
Yra ir textual borders komanda, kuri parodo visų widgetų ribas – labai naudinga, kai derinsite layout’us ir nesuprantate, kodėl kažkas netelpa ar persidengia.
Dar vienas patarimas – naudokite type hints. Textual yra gerai anotizuotas, ir modernus IDE kaip PyCharm ar VS Code su Pylance suteiks puikią autocomplete ir klaidu aptikimą dar prieš paleisdami kodą.
Ką reikia žinoti prieš pradedant projektą
Textual yra brandi biblioteka, bet ji vis dar aktyviai vystoma. API daugmaž stabilizavosi, bet kartais pasitaiko breaking changes. Sekite release notes, jei naudojate production’e.
Terminalo suderinamumas – ne visi terminalai vienodi. Modernūs terminalai kaip iTerm2, Windows Terminal, Alacritty puikiai palaiko visas Textual galimybes. Senesni ar egzotiškesni terminalai gali turėti problemų su spalvomis ar pelės įvykiais. Textual stengiasi gracefully degraduoti, bet turėkite tai omenyje.
Dokumentacija yra gera, bet kartais trūksta gilesnių pavyzdžių. Laimei, bendruomenė aktyvi, ir GitHub discussions skiltyje galite rasti atsakymus į daugumą klausimų. Taip pat verta pasižiūrėti į oficialius pavyzdžius repository – ten yra daug praktinių kodų.
Testavimas – Textual aplikacijas galima testuoti automatiškai. Biblioteka suteikia įrankius simuliuoti vartotojo įvestį ir patikrinti widgetų būsenas. Tai ne taip patogu kaip web aplikacijų testavimas su Selenium, bet tikrai įmanoma.
Kur eiti toliau ir kaip išmokti daugiau
Jei rimtai susidomėjote Textual, štai keletas rekomendacijų kaip gilinti žinias. Oficiali dokumentacija yra geras startinis taškas, bet tikrasis mokymasis prasideda, kai pradedate kurti realius projektus.
Pradėkite nuo kažko paprasto – galbūt TODO sąrašo aplikacijos ar paprastos sistemos monitoriaus. Tai leis išmokti pagrindų be per didelio frustracijos. Paskui pabandykite integruoti Textual į esamus CLI įrankius – galbūt turite kokį skriptą, kuriam TUI sąsaja būtų naudinga.
Pasižiūrėkite į atviro kodo projektus, kurie naudoja Textual. Be minėto posting, yra ir kitų įdomių pavyzdžių. Skaitydami kitų žmonių kodą išmoksite best practices ir pamatysite, kaip spręsti įvairias problemas.
Eksperimentuokite su stilizavimu. Textual CSS sistema yra galinga, ir galite sukurti tikrai gražias sąsajas. Pabandykite atkurti kokios nors žinomos aplikacijos išvaizdą – tai geras būdas išmokti layout sistemą.
Galiausiai, nebijokit klausinėti bendruomenės. Textual Discord serveris ir GitHub discussions yra draugiški, ir žmonės mielai padeda. Jei rasite bug’ą ar turite feature request’ą, nekuklaukite – projektas aktyviai priima contributions.
Textual keičia tai, kaip galvojame apie terminalo aplikacijas. Tai nebėra tik paprastas tekstas su spalvomis – tai pilnaverčiai user interfaces su moderniomis galimybėmis. Ir Python bendruomenė turi puikų įrankį tai realizuoti. Ar jūsų kitas projektas bus su TUI? Galbūt verta pamėginti.
