3 Punkte von GN⁺ 2024-08-12 | 1 Kommentare | Auf WhatsApp teilen

7 Dinge, die ich beim Aufbau eines modernen TUI-Frameworks gelernt habe

Terminals sind schnell

  • Moderne Terminal-Emulatoren sind hochentwickelte Software
  • Mit hardwarebeschleunigtem Rendering lässt sich Bildschirmflackern reduzieren
  • Drei Tricks, um Flackern zu verringern:
    • Den Bildschirm nicht löschen, sondern überschreiben
    • In einem Rutsch auf die Standardausgabe schreiben
    • Das Protokoll für synchronisierte Ausgabe verwenden
  • Textual nutzt standardmäßig 60 fps und bietet dadurch flüssige Animationen

DictViews sind erstaunlich

  • Die Methoden keys() und items() von Python-dicts geben KeysView bzw. ItemsView zurück
  • Mit der symmetrischen Differenz von ItemsView-Objekten lassen sich geänderte Einträge leicht finden
  • In Textual wird das bei Änderungen von CSS-Eigenschaften für optimierte Updates verwendet

lru_cache ist schnell

  • Der Decorator @lru_cache aus dem Modul functools cached die Rückgabewerte von Funktionen
  • In Textual wird @lru_cache bei kleinen Funktionen eingesetzt, die häufig aufgerufen werden, um die Performance zu verbessern
  • Man sollte die Cache-Informationen (cache_info()) prüfen, um zu sehen, ob das Caching effektiv ist

Unveränderliche Objekte sind am besten

  • Mit Python-Tupeln, NamedTuples oder frozen dataclasses kann man die Vorteile unveränderlicher Objekte nutzen
  • Unveränderliche Objekte erleichtern das Schreiben von Code ohne Seiteneffekte und machen Tests sowie Caching einfacher

Unicode-Art ist nützlich

  • Diagramme mit Unicode-Rahmenzeichen sind für die Dokumentation sehr nützlich
  • In Kombination mit gut geschriebenen Docstrings ist das besonders hilfreich

Brüche sind präzise

  • Das Modul fractions in Python hilft, Gleitkommafehler zu vermeiden
  • In Textual werden Brüche verwendet, um den Bildschirm proportional aufzuteilen und so ein präzises Layout umzusetzen

Emojis sind schrecklich

  • Die Emoji-Unterstützung im Terminal ist unvorhersehbar und komplex
  • Die Breite von Emojis wird zwar über die Unicode-Datenbank geprüft, aber neuere Emojis können unvorhersehbare Ergebnisse verursachen
  • Emojis aus mehreren Codepoints führen zu noch größeren Problemen

Zusammenfassung von GN⁺

  • Der Artikel bietet nützliche Tipps und Tricks für die Entwicklung von Terminal-Anwendungen in Python
  • Er teilt praxisnahe Ratschläge aus der Entwicklung des Textual-Frameworks
  • Er erklärt, wie man mit komplexen Problemen wie Emojis umgeht, und ist damit für Entwickler hilfreich
  • Ähnliche Projekte mit vergleichbarem Funktionsumfang sind urwid und prompt_toolkit

1 Kommentare

 
GN⁺ 2024-08-12
Hacker-News-Kommentare
  • TUI-Entwickler müssen Unicode, internationale Zeichen und die Verarbeitung von Emojis als separates Projekt behandeln

    • In den Paketen rivo/tview und rivo/uniseg traten dieselben Probleme auf
    • Jeder Maintainer einer TUI-Bibliothek entwickelte eine eigene Lösung
    • Zeichenbreiten sind nicht standardisiert, was Terminals kompliziert macht
    • Der OP unterstützt nur Unicode 9 (die aktuelle Unicode-Version ist 15.1)
    • Am Ende werden sich Nutzer darüber beschweren, dass bestimmte Emojis oder internationale Zeichen nicht korrekt gerendert werden
  • Es stört, dass Textual React nachahmen will

    • React ist ein populäres Framework, aber kein guter Weg, Benutzeroberflächen zu bauen
    • Grundlegendes responsives Design ist ein gut bekanntes Verfahren
    • CSS zu verwenden wirkt übertrieben
    • Das React-Modell untergräbt ohnehin bereits viele Konzepte von CSS
    • Wenn man CSS nicht verwenden müsste, wäre es in Ordnung
  • Nach dem Ausprobieren von Textual stellte sich heraus, dass man CSS verwenden muss

    • Es gibt keine guten Standardkomponenten, also muss man sie selbst bauen
    • Es verwendet externe Stylesheets statt Python-Klassen
    • Aus diesen Gründen passt Textual derzeit noch nicht zu mir
    • In Python sollte es einen klaren Weg geben
    • Es ahmt React zu eng nach und übernimmt damit die Schwächen der JavaScript-Community
  • Dieses TUI sieht hübsch aus, aber ich kann mir keine reale Situation vorstellen, in der ich es nutzen würde

    • Man gibt sich entweder mit minimaler Funktionalität zufrieden oder verwendet gleich eine GUI
    • Im YouTube-Link wird eine Tabelle gezeigt, bei der Zellen hervorgehoben werden können
    • Ich verstehe nicht, warum das in einem TUI nötig ist
    • Am Ende wird man ohnehin eine richtige GUI brauchen
  • kitty bietet mehr Funktionen

  • Ich verstehe nicht, warum Softwareingenieure sich so sehr für TUIs interessieren

    • Ich mag gute Kommandozeilenprogramme, aber TUIs sprechen mich nicht an
  • Monodraw ist zwar nur für MacOS, aber es gibt auch auf anderen Plattformen gute Alternativen

  • „Überschreiben, nicht löschen“ war früher die Art, wie Spiele entwickelt wurden

    • Vor DirectX schrieb man direkt in den Framebuffer und zeichnete nur die geänderten Bereiche neu
  • Es gibt eine Methode, die Unicode-Version abzuschätzen, indem man die Cursorposition im Terminal prüft

    • Das Terminal rendert Emojis auf unvorhersehbare Weise
    • Man könnte diese Methode jedes Mal verwenden, wenn man die Breite einer Zeichenkette bestimmen muss
    • Ich war von wcwidth so genervt, dass ich diese Methode einmal benutzt habe
  • Nach der Bewertung mehrerer TUI-Bibliotheken war FTXUI am einfachsten zu benutzen und am zuverlässigsten

    • FTXUI
    • Nützlich, um interaktive Dashboards mit Unterstützung für Tastatur und Maus zu erstellen