6 điểm bởi GN⁺ 2023-08-20 | 1 bình luận | Chia sẻ qua WhatsApp
  • Textual là một framework cho phép tạo giao diện người dùng đa nền tảng bằng API Python đơn giản, và chạy ứng dụng trong terminal hoặc trình duyệt web
  • API kết hợp các yếu tố phát triển hiện đại của Python và web, đồng thời hỗ trợ bảo trì lâu dài nhờ các component tách biệt và framework kiểm thử nâng cao
  • Thư viện widget cung cấp nút bấm, điều khiển cây, bảng dữ liệu, ô nhập, vùng văn bản, v.v., cùng với hệ thống layout linh hoạt và các theme dựng sẵn
  • Về bản chất bên trong, đây là framework bất đồng bộ, có thể tích hợp với các thư viện async nếu muốn và không bắt buộc phải dùng async
  • Cài đặt bằng pip install textual textual-dev, và có thể chạy bản demo bằng python -m textual
    • Có thể chạy textual demo mà không cần cài đặt bằng uvx --python 3.12 textual-demo, cách này yêu cầu uv
  • Gói textual-dev cung cấp bảng điều khiển phát triển kết nối tới ứng dụng từ một terminal khác, hỗ trợ xem thông điệp hệ thống, sự kiện, thông điệp log và đầu ra print
  • Ứng dụng Textual cung cấp command palette với tìm kiếm mờ, có thể mở bằng ctrl+p và mở rộng bằng lệnh tùy chỉnh cho ứng dụng
  • Có thể phục vụ ứng dụng Textual trên web bằng textual serve "python -m textual", và Textual Web hỗ trợ triển khai ứng dụng ngoài việc phục vụ cục bộ
  • Ứng dụng Textual có yêu cầu hệ thống thấp, có thể cài ở bất cứ đâu chạy được Python và không cần môi trường desktop

1 bình luận

 
GN⁺ 2023-08-20
Ý kiến trên Hacker News
  • Demo Textual mình thích nhất hiện giờ là https://github.com/1j01/textual-paint
    Một bản nhái Microsoft Paint khá ổn chạy trong terminal

  • Một trong những thứ đầu tiên mình thêm vào khi tạo dự án Python mới là https://github.com/Textualize/rich
    Mình chọn vì nó giúp làm cho output trong terminal trông đẹp hơn quá dễ

    • Mình thích làm công cụ dòng lệnh và cũng thích giao diện của Textual, nhưng sau vài lần dùng thì với mình nó hơi nặng và thiếu linh hoạt
      Ngược lại, Rich thì tuyệt vời và làm luồng phát triển rất mượt. Mình thích việc có API tốt để dùng ngay các tính năng như chữ đậm, màu sắc, emoji, bảng
    • Trông thật sự rất đẹp, không biết Go hay Rust có thư viện tương tự không
  • Trông khá hay
    Ở công ty trading trước đây, khi làm text UI cho một quy trình quan trọng, chúng tôi đã dùng lanterna(https://github.com/mabe02/lanterna/tree/master). Đó là quy trình nhận dữ liệu thị trường được cập nhật và xử lý những thứ thay đổi giữa phiên giao dịch trước và hôm nay, chẳng hạn đổi tên mã/cổ phiếu (từ PCLN sang BKNG), đổi danh mục do thay đổi vốn hóa thị trường
    Đó là những việc hệ thống real-time không xử lý, nhưng lại xảy ra quá thường xuyên hoặc quá khó để xử lý thủ công. Công ty có UI desktop cho nhân viên trading, nhưng không có khái niệm UI cho server, và server thì headless
    Không có frontend developer; backend, system và data programmer thỉnh thoảng mới đụng frontend, nên web UI thường rất đơn giản hoặc chỉ phục vụ một mục đích cụ thể, cũng không có công cụ chung
    Nếu là năm 2023 thì có thể tôi đã chọn create-react-app hoặc next.js, nhưng vì muốn có thể truy cập dễ dàng ngay cả qua kết nối SSH tệ hại trên 4G tethering khi on-call, nên tôi loại X11 forwarding và RDP. Vì vậy tôi tìm một TUI builder dùng được trong Java, ngôn ngữ của dự án
    Điểm hay của Lanterna là có implementation dựa trên Swing, nên có thể chạy ngay trong IntelliJ để lặp nhanh khi phát triển, còn ở môi trường vận hành thì có thể SSH vào máy có server và chạy terminal
    Tôi vẫn sẽ tiếp tục theo dõi Textual để xem có thể làm được thứ gì ổn không. Tôi vẫn không thích web app lắm, vì cảm giác để đạt được kết quả tương đương về chức năng so với TUI hoặc desktop GUI không chạy trong trình duyệt thì cần nhiều công sức hơn

  • Tiếc là cụm “phát triển ứng dụng nhanh” có vẻ cũng áp dụng cho chính thư viện này
    Cứ hai tuần lại có release mới, và nó bị vỡ ở những chỗ hơi khó đoán. Dùng Textual để làm prototype thì dễ, nhưng bảo trì về sau thì khó

    • Tôi hiểu điều đó có thể gây khó chịu. Là người đang bảo trì code viết bằng Textual nên tôi biết rất rõ
      Tuy nhiên, khi vẫn còn ở phiên bản 0.x, chúng tôi đang tận dụng tối đa lợi thế là có thể dần đổi hướng ở những phần mà cách tiếp cận tốt hơn trở nên rõ ràng
      Khi ra release mới, chúng tôi cố gắng làm cho các breaking change dễ thấy nhất có thể. Nếu có phần nào khó workaround hoặc khó làm cho chạy lại, bạn có thể nhờ trợ giúp qua GitHub issue, discussion, hoặc Discord nếu muốn
  • Vì tôi không phải developer có nhiều kinh nghiệm Python, cho tôi hỏi việc đóng gói cái này thành binary không kèm nhiều dependency thì dễ đến mức nào
    Tôi đang tìm thứ gì đó giúp tạo gói cài đặt sản phẩm cho Windows và Linux. Khách hàng cần làm các bước cấu hình trước/sau khi cài phần mềm như ghi file INI, kiểm tra kết nối DB, kiểm tra HTTP server

    • Có nhiều lựa chọn, nhưng theo kinh nghiệm của tôi trong mảng này thì PyInstaller là dễ nhất
  • Trông hay đấy. Tôi vừa làm một app nội bộ cho DevOps và change management bằng unicurses và Python; nó chạy được nhưng có lẽ khả năng mở rộng không tốt
    Ban đầu tôi thử TK và QT, nhưng cả hai đều có vài điểm kỳ quặc ở khâu cài đặt ban đầu. QT thì chạy tốt, nhưng tài liệu hữu ích hơi thiếu
    Textual có vẻ rất khớp với yêu cầu, nên chắc chắn tôi sẽ thử

  • Tôi lướt nhanh và xem https://textual.textualize.io/tutorial/ cùng https://github.com/Textualize/textual/blob/main/docs/example...
    Tôi tò mò phía Go mọi người đã dùng thành công cái gì. Lý do Textualize hấp dẫn là nó có cảm giác khá giống trình duyệt web, và cả phần xem bảng có thể cuộn cũng gọn gàng
    tview trông cũng thú vị, nhưng ví dụ nhìn brew install dbui thì có cảm giác thiên về tự xử lý kiểu mệnh lệnh như if KeyPress.A: do_something() hơn là điều hướng khai báo và lồng nhau
    Có lẽ đây là khác biệt giữa góc nhìn ứng dụng-centric/SPA kiểu “kiểm soát mọi thứ” và góc nhìn document-centric kiểu “thêm component vào trang rồi để nó chảy”. Tôi muốn nghe phản hồi về các mục trong danh sách này: https://codeberg.org/tecras/awesome-go#advanced-console-uis

    • “Tự xử lý kiểu mệnh lệnh như if KeyPress.A: do_something()” nghĩa là, thay vì che giấu message loop như xu hướng gần đây, nó thực sự cho bạn kiểm soát nó à?
    • Bubble Tea rất tuyệt
    • Tôi đã dùng termui trong dự án và không có gì phàn nàn
      https://github.com/gizak/termui
  • Lazarus/Freepascal mới là đáp án. Phần còn lại gần như là bước lùi

  • Những animation và transition kiểu này được triển khai chỉ bằng text ASCII thuần à?

    • Chính xác hơn là text Unicode, nhưng đúng vậy. Tất cả đều là text
    • Đúng, đã làm terminal trở nên có cảm giác chậm chạp /s
      Nói nghiêm túc thì các tính năng “easing” và transition đáng để xem qua. Độ trễ khoảng 500ms có thể gây khó chịu với người dùng thành thạo, nhưng có vẻ hữu ích để cung cấp ngữ cảnh trong lúc học cách điều hướng app
  • Tôi tò mò những dự án như thế này được duy trì bằng cách nào
    Dự án này đã được phát triển 2 năm rồi nhưng tôi không thấy nguồn doanh thu. Không biết các developer có được trả công dưới hình thức nào không

    • Dự án này đã nhận đầu tư seed. Nhà sáng lập Textual có viết một bài blog liên quan, đáng đọc
      https://www.willmcgugan.com/blog/tech/post/from-open-source-...
    • Phần lớn dự án mã nguồn mở được làm và duy trì như sở thích, hoặc như dự án phụ liên quan đến công việc có lương khác
      Cũng cần xét đến thị trường. Năm 2023, gần như đúng nghĩa là rất ít người sẵn sàng trả tiền để dùng thư viện widget cho terminal