GN⁺: 현대적인 TUI Framework 구축에서 배운 것들
(textualize.io)현대 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
- 키보드와 마우스를 지원하는 대화형 대시보드를 만드는 데 유용함