7 สิ่งที่ได้เรียนรู้ระหว่างสร้างเฟรมเวิร์ก TUI สมัยใหม่
เทอร์มินัลเร็วมาก
- ตัวจำลองเทอร์มินัลสมัยใหม่เป็นซอฟต์แวร์ที่ซับซ้อนและประณีตมาก
- สามารถใช้การเรนเดอร์แบบเร่งด้วยฮาร์ดแวร์เพื่อลดอาการหน้าจอกะพริบได้
- 3 เทคนิคในการลดอาการกะพริบ:
- อย่าล้างหน้าจอ แต่เขียนทับลงไป
- เขียนออกไปยัง standard output ในครั้งเดียว
- ใช้โปรโตคอล Synchronized Output
- Textual ใช้ 60fps เป็นค่าเริ่มต้นเพื่อมอบแอนิเมชันที่ลื่นไหล
DictViews น่าทึ่งมาก
- เมธอด
keys() และ items() ของ dict ใน Python จะคืนค่า KeysView และ ItemsView
- สามารถใช้ symmetric difference ของอ็อบเจ็กต์
ItemsView เพื่อค้นหารายการที่เปลี่ยนแปลงได้อย่างง่ายดาย
- ใน Textual มีการใช้งานสิ่งนี้เมื่อพร็อพเพอร์ตี CSS เปลี่ยนไป เพื่อให้อัปเดตได้อย่างเหมาะสมที่สุด
lru_cache เร็วมาก
- ดีคอเรเตอร์
@lru_cache ในโมดูล functools ใช้แคชค่าที่ฟังก์ชันส่งกลับ
- ใน Textual มีการใช้
@lru_cache กับฟังก์ชันขนาดเล็กที่ถูกเรียกบ่อยเพื่อเพิ่มประสิทธิภาพ
- ควรตรวจสอบข้อมูลแคช (
cache_info()) เพื่อยืนยันว่าการแคชได้ผลจริง
อ็อบเจ็กต์ immutable ดีที่สุด
- สามารถใช้ tuple,
NamedTuples หรือ frozen dataclasses ของ Python เพื่อรับประโยชน์จากอ็อบเจ็กต์ immutable
- การใช้อ็อบเจ็กต์ immutable ช่วยให้เขียนโค้ดที่ไม่มีผลข้างเคียง ทำให้ทดสอบและแคชได้ง่ายขึ้น
Unicode art มีประโยชน์มาก
- ไดอะแกรมที่ใช้ตัวอักษรกล่องของ Unicode มีประโยชน์อย่างมากต่อการทำเอกสาร
- เมื่อใช้ร่วมกับ docstring ที่เขียนดีแล้ว จะช่วยได้มาก
เศษส่วนให้ความแม่นยำ
- โมดูล
fractions ของ Python ช่วยหลีกเลี่ยงข้อผิดพลาดจากเลขทศนิยมแบบลอยตัวได้
- ใน Textual มีการใช้เศษส่วนเมื่อแบ่งหน้าจอตามสัดส่วน เพื่อให้ได้เลย์เอาต์ที่แม่นยำ
อีโมจิแย่มาก
- การรองรับอีโมจิในเทอร์มินัลนั้นคาดเดาได้ยากและซับซ้อน
- แม้จะใช้ฐานข้อมูล Unicode เพื่อตรวจสอบความกว้างของอีโมจิ แต่อีโมจิรุ่นใหม่ ๆ ก็อาจให้ผลลัพธ์ที่คาดเดาไม่ได้
- อีโมจิแบบหลายโค้ดพอยต์ทำให้เกิดปัญหาหนักขึ้นไปอีก
สรุปของ GN⁺
- บทความนี้ให้ทิปและเทคนิคที่มีประโยชน์สำหรับการพัฒนาแอปพลิเคชันเทอร์มินัลด้วย Python
- ผู้เขียนแบ่งปันคำแนะนำเชิงปฏิบัติที่ได้จากประสบการณ์พัฒนาเฟรมเวิร์ก Textual
- อธิบายวิธีรับมือกับปัญหาซับซ้อนอย่างอีโมจิ ซึ่งเป็นประโยชน์ต่อผู้พัฒนา
- โปรเจ็กต์ที่มีความสามารถคล้ายกันได้แก่ urwid และ prompt_toolkit
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
นักพัฒนา TUI ต้องจัดการเรื่อง Unicode, อักขระนานาชาติ และอีโมจิเป็นโปรเจกต์แยกต่างหาก
ไม่ชอบที่ Textual พยายามเลียนแบบ React
จากที่ได้ลองใช้ Textual พบว่าจำเป็นต้องใช้ CSS
TUI นี้ดูสวย แต่ก็นึกไม่ออกว่าจะใช้จริงในสถานการณ์ไหน
kitty มีฟีเจอร์มากกว่า
ไม่เข้าใจว่าทำไมวิศวกรซอฟต์แวร์ถึงสนใจ TUI กันมากนัก
Monodraw ใช้ได้เฉพาะบน MacOS แต่ก็มีทางเลือกที่ดีบนแพลตฟอร์มอื่น
"เขียนทับ ไม่ลบ" เป็นวิธีพัฒนาเกมในอดีต
มีวิธีประมาณเวอร์ชัน Unicode โดยตรวจสอบตำแหน่งเคอร์เซอร์ในเทอร์มินัล
wcwidthหลังจากประเมินไลบรารี TUI หลายตัวแล้ว FTXUI ใช้งานง่ายและเชื่อถือได้มากที่สุด