3P by neo 3달전 | favorite | 댓글 1개

현대 TUI 프레임워크를 구축하며 배운 7가지

터미널은 빠름

  • 현대 터미널 에뮬레이터는 매우 정교한 소프트웨어임
  • 하드웨어 가속 렌더링을 사용하여 화면 깜박임을 줄일 수 있음
  • 깜박임을 줄이는 세 가지 트릭:
    • 화면을 지우지 말고 덮어쓰기
    • 표준 출력으로 한 번에 쓰기
    • Synchronized Output 프로토콜 사용
  • Textual은 60fps를 기본으로 사용하여 매끄러운 애니메이션을 제공함

DictViews는 놀라움

  • Python의 dicts의 keys()와 items() 메서드는 KeysView와 ItemsView를 반환함
  • ItemsView 객체의 대칭 차이를 사용하여 변경된 항목을 쉽게 찾을 수 있음
  • Textual에서는 CSS 속성이 변경될 때 최적화된 업데이트를 위해 사용됨

lru_cache는 빠름

  • functools 모듈의 @lru_cache 데코레이터는 함수의 반환 값을 캐시함
  • Textual에서 자주 호출되는 작은 함수에 @lru_cache를 사용하여 성능을 향상시킴
  • 캐시 정보(cache_info())를 확인하여 캐싱이 효과적인지 확인해야 함

불변 객체가 최고

  • Python의 튜플, NamedTuples, 또는 frozen dataclasses를 사용하여 불변 객체의 이점을 얻을 수 있음
  • 불변 객체를 사용하면 부작용이 없는 코드를 작성할 수 있어 테스트와 캐싱이 쉬워짐

유니코드 아트는 좋음

  • 유니코드 박스 문자를 사용한 다이어그램은 문서화에 매우 유용함
  • 잘 작성된 docstring과 함께 사용하면 큰 도움이 됨

분수는 정확함

  • Python의 fractions 모듈은 부동 소수점 오류를 피할 수 있음
  • Textual에서 화면을 비율에 따라 나눌 때 분수를 사용하여 정확한 레이아웃을 구현함

이모지는 끔찍함

  • 터미널에서 이모지 지원은 예측할 수 없고 복잡함
  • 유니코드 데이터베이스를 사용하여 이모지의 너비를 확인하지만, 최신 이모지는 예측할 수 없는 결과를 초래할 수 있음
  • 멀티 코드포인트 이모지는 더 큰 문제를 야기함

GN⁺의 정리

  • 이 글은 Python 터미널 애플리케이션 개발 시 유용한 팁과 트릭을 제공함
  • Textual 프레임워크의 개발 경험을 통해 얻은 실용적인 조언을 공유함
  • 이모지와 같은 복잡한 문제를 다루는 방법을 설명하여 개발자들에게 도움이 됨
  • 비슷한 기능을 가진 프로젝트로는 urwid와 prompt_toolkit이 있음
Hacker News 의견
  • TUI 개발자는 유니코드와 국제 문자 및 이모지 처리를 별도의 프로젝트로 다루게 됨

    • rivo/tview와 rivo/uniseg 패키지에서 동일한 문제를 겪음
    • 각 TUI 라이브러리 유지 관리자는 고유한 해결책을 개발함
    • 문자 너비가 표준화되지 않아 터미널이 복잡함
    • OP는 유니코드 9만 지원함 (현재 유니코드 버전은 15.1)
    • 결국 사용자는 특정 이모지나 국제 문자가 제대로 렌더링되지 않는다고 불평할 것임
  • Textual이 React를 모방하려는 점이 불만임

    • React는 인기 있는 프레임워크이지만, 사용자 인터페이스를 만드는 좋은 방법은 아님
    • 기본적인 반응형 디자인은 잘 알려진 방법임
    • CSS를 사용하는 것은 과도한 것 같음
    • React 모델은 이미 CSS의 개념을 많이 깨뜨림
    • CSS를 사용하지 않아도 된다면 괜찮음
  • Textual을 사용해 본 결과, CSS를 사용해야 함

    • 좋은 표준 컴포넌트가 없어서 직접 만들어야 함
    • Python 클래스가 아닌 외부 스타일 시트를 사용함
    • 이러한 이유로 Textual은 아직 나에게 맞지 않음
    • Python에서는 하나의 명확한 방법이 있어야 함
    • React를 너무 밀접하게 모방하여 JavaScript 커뮤니티의 단점을 반영함
  • 이 TUI는 예쁘지만 실제로 사용할 상황이 떠오르지 않음

    • 최소한의 기능에 만족하거나 바로 GUI를 사용함
    • YouTube 링크에서 셀 강조 표시가 가능한 테이블을 보여줌
    • TUI에서 왜 필요한지 이해되지 않음
    • 결국 제대로 된 GUI가 필요할 것임
  • kitty는 더 많은 기능을 제공함

  • 소프트웨어 엔지니어가 TUI에 왜 그렇게 관심을 가지는지 이해되지 않음

    • 좋은 명령줄 프로그램을 좋아하지만 TUI는 매력적이지 않음
  • Monodraw는 MacOS 전용이지만 다른 플랫폼에도 좋은 대안이 있음

  • "덮어쓰기, 지우지 않기"는 과거 게임 개발 방식임

    • DirectX 이전에는 프레임 버퍼에 직접 쓰고 변경된 부분만 다시 그렸음
  • 터미널에서 커서 위치를 확인하여 유니코드 버전을 추정하는 방법이 있음

    • 터미널이 이모지를 예측할 수 없게 렌더링함
    • 문자열 너비를 결정할 때마다 이 방법을 사용할 수 있음
    • wcwidth에 짜증이 나서 이 방법을 사용한 적이 있음
  • 여러 TUI 라이브러리를 평가한 결과, FTXUI가 가장 사용하기 쉽고 신뢰할 수 있었음

    • FTXUI
    • 키보드와 마우스를 지원하는 대화형 대시보드를 만드는 데 유용함