Modyfikowanie danych na żywo na ekranie - seria Spectre Console
Spectre.Console to biblioteka .NET, która pozwala tworzyć piękne aplikacje konsolowe, wykraczające poza zwykłą, czarno-białą linię poleceń. W swoim filmie "Modifying Data Live On-Screen – Spectre Console Series" Tim Corey demonstruje funkcję wyświetlania na żywo w Spectre.Console. Ta funkcja umożliwia wyświetlanie postępu i aktualizację danych na ekranie w czasie rzeczywistym w aplikacjach konsolowych.
W tym artykułe przejdziemy przez film Tima, pokazując, gdzie robi każdą rzecz i jak to tłumaczy.
Wprowadzenie do wyświetlania na żywo
Tim zaczyna od wyjaśnienia Spectre.Console i jak to sprawia, że aplikacje konsolowe stają się wizualnie atrakcyjne. W tej serii każda lekcja to krótki przykład, a kod źródłowy jest podlinkowany w opisie.
Wyjaśnia, że ta lekcja skupia się na tym, jak używać funkcji wyświetlania na żywo do modyfikacji istniejących danych na ekranie dla aktualizacji w czasie rzeczywistym. Tim również zachęca widzów do subskrypcji i odwiedzenia iamtimcorey.com po więcej zasobów szkoleniowych.
Tworzenie nowej tabeli dla danych
Tim pokazuje, że już stworzył nową tabelę z kolumnami tytuł, lekcje i godziny. Ta tabela będzie używana do renderowania informacji o kursach pobranych z API.
Przedstawia również typ rekordu o nazwie CourseInfo z silnie typowanymi właściwościami dla nazw kursów, liczby lekcji i długości kursów w godzinach. To odzwierciedla strukturę API i pozwala mu łatwo wyprowadzać tekst w sposób silnie typowany.
Tabela ma włączone pokazywanie stóp, dzięki czemu później można wyświetlić sumy. Tim zauważa, że ten układ to jeden z wielu arbitralnych widgetów wspieranych przez Spectre do tworzenia pięknych aplikacji konsolowych.
Rozpoczynanie wyświetlania na żywo
Tim używa metody AnsiConsole.Live(table).StartAsync(...) do rozpoczęcia wyświetlania na żywo. Wskazuje, że istnieje również funkcja Start() bez async, jeśli nie trzeba oczekiwać na długo działające zadania.
Opakowuje swój kod w kontekście async, aby konsola mogła się odświeżać, gdy przybywają nowe wiersze. Demonstracja zdolności obecnego terminala do przerysowywania wyjścia bez czyszczenia ekranu.
Pobieranie danych i wyświetlanie postępu
W środku kontekstu na żywo, Tim pisze pętlę for używając integer index od 1 do 31, ponieważ przykładowe API wymienia 31 kursów. Dla każdego indeksu wywołuje metodę klasy pomocniczej do pobrania danych z API.
Ta funkcja pomocnicza przekształca surowy łańcuch JSON na silnie typowany obiekt CourseInfo. Tim celowo wywołuje API jeden kurs naraz, zamiast hurtowo, aby pokazać, jak postęp wyświetlania zachodzi na żywo — doskonały przykład symulacji długo działających zadań w środowisku konsolowym.
Zauważa, że gdyby chciał tylko jednego żądania, mógłby usunąć /i w URL, ale robi wiele wywołań "aby pokazać rzeczy przychodzące z czasem".
Dodawanie wierszy i aktualizowanie wyjścia
Z każdym zwróconym obiektem CourseInfo Tim wywołuje table.AddRow(...) aby utworzyć nowy wiersz z tytułem kursu, liczbą lekcji i długością w godzinach. Używa interpolacji łańcuchów ze składnią $ i wywołuje .ToString() tam gdzie to konieczne, aby konwertować wartości, które nie są łańcuchami.
To renderuje tabelę z nowymi wierszami przy każdym przejściu, pokazując jak Spectre może dynamicznie aktualizować wiersze. Demonstruje również jak wychwytywać potencjalne problemy, takie jak niezgodności typów, poprzez byćie dokładnym w kwestii konwersji.
Niestandardowe stopki i sumy bieżące
Następnie Tim pokazuje, jak dodać niestandardowe stopki do kolumn. Ustawia table.Columns[0].Footer aby pokazać liczbę kursów pobranych do tej pory. Duplikuje to dla drugiej i trzeciej kolumny, ale tym razem sumuje liczby lekcji i całkowite godziny we wszystkich kursach.
Dzięki temu użytkownik może na pierwszy rzut oka zobaczyć, ile lekcji i godzin się nagromadziło. To rzeczywisty przykład użycia kontroli Spectre do wyświetlania sum wartości w połączeniu z danymi na żywo.
Tim na chwilę "odpina" okno, aby można było zobaczyć cały układ, gdy liczby wzrastają. Wyjaśnia, że stopki to część wbudowanych stylów oferowanych przez Spectre, podobnie jak ramki, markup i motywy.
Odświeżanie kontekstu po każdej akcji
Tim podkreśla "krytyczną rzecz" dotyczącą wyświetlania na żywo: zawsze wywołuj context.Refresh() po dokonaniu zmian. To zapewnia rzeczywiste przerysowanie przez terminal Twojego wyjścia z nowymi danymi. Bez tego Twoje wiersze, stopki, a nawet różne kolory nie pojawią się aż do zakończenia sesji na żywo.
Debugowanie i obsługa wyjątków
Kiedy po raz pierwszy uruchamiał kod, Tim napotkał wyjątek Index Out of Range. Przeprowadza się przez swój błąd — błędne zliczanie wskaźników kolumn (to są 0,1,2 a nie 0,2,3) — i poprawia go.
To delikatne przypomnienie, że nawet w Spectre.Console powinno się wychwytywać błędy i upewniać się, że indeksy i argumenty są poprawne.

Oglądanie wyświetlania na żywo w akcji
Tim uruchamia poprawiony kod i pokazuje wyświetlanie na żywo w akcji: dodawanie wierszy, aktualizacja sum i wyświetlanie połączonych wartości w stopce.
Można zobaczyć "1,652 lekcje", "403,5 godzin" i "31 wszystkich kursów" jak dane strumieniują. To dokładnie ten rodzaj akcji, który sprawia, że wyświetlanie na żywo Spectre.Console przypomina dashboard w terminalu.

Skupienie się tylko na stopkach
Aby zmiany były bardziej widoczne, Tim komentuje kod dodawania wierszy, dzięki czemu aktualizują się tylko stopki. To pokazuje, jak można śledzić sumy nawet bez przewijających się danych.
Zauważa również, że Spectre automatycznie dopasowuje szerokość kolumny, gdy liczby się powiększają (np. z 9 na 10). To mały, ale potężny przykład automatycznego wykrywania szerokości i formatu przez bibliotekę.

Poza tabelami – arbitralne widgety i motywy
Tim wyjaśnia, że wyświetlanie na żywo nie jest ograniczone do tabel. Można je zastosować do arbitralnych widgetów, takich jak panele, zachęcenie do wprowadzenia przez użytkownika czy nawet wykresu słupkowego. Możesz aktualizować tekst, podświetlać różne kolory, stosować niestandardowe motywy z kodowaniem kolorów lub dodawać spinnery.
Wspomina, że można zmieniać style takie jak niebieski, zielony czy szary, aby dopasować do motywów, a nawet pracować z zagnieżdżonymi układami lub widgetami. Ta elastyczność jest tym, co sprawia, że Spectre jest "mocno inspirowany" bogatymi narzędziami konsolowymi z innych ekosystemów (niektóre nawet napisane w pythonie), ale dostosowane do .NET.
Async vs. Sync rozpoczęcie wyświetlania na żywo
Tim wyjaśnia, dłączego użył wersji async: ponieważ czekał na wywołania API. Jeśli Twoje aktualizacje nie są asynchroniczne, możesz po prostu wywołać Start() bez oczekiwania.
Ten wybór pomaga budować piękne aplikacje konsolowe, które pozostają responsywne nawet przy długotrwałych zadaniach.
Wnioski
W swoim filmie Tim właśnie pokazał, jak zbudować wyświetlanie na żywo w Spectre Console, które może aktualizować, sumować i odświeżać dane bezpośrednio w konsoli.
To świetna podstawa do zapraszania do wprowadzenia danych przez użytkownika, dodawania widgetów czy budowania dashboardów z różnymi kolorami i niestandardowymi motywami z kodowaniem kolorów. W połączeniu z możliwością Spectre do łatwego wyprowadzania tekstu, używania markup i tworzenia kontrolek takich jak panele lub drzewa, można tworzyć dynamiczne aplikacje .NET bezpośrednio w terminalu.
Demonstracja Tima pokazuje, że za pomocą Spectre.Console można tworzyć nie tylko dashboardy, ale także tabele aktualizujące się na żywo, spinnery i inne widgety. To praktyczny przykład przekształcania zwykłej konsoli w narzędzie interaktywne w czasie rzeczywistym — i miły sposób, by powiedzieć swoim użytkownikom "happy coding".
