Первоначально опубликовано на сайте appliedgo.net 2 апреля 2017 г.

Хотите оснастить свое приложение командной строки красивым визуальным пользовательским интерфейсом? Библиотеки TUI всегда готовы помочь.

Консольные приложения обычно принимают некоторые параметры при запуске и, возможно, еще несколько входных данных через базовый консольный ввод-вывод. И это нормально в большинстве случаев, хотя иногда было бы здорово иметь визуальный пользовательский интерфейс, но без размера кода и сложности полноценного веб-приложения.

Библиотеки Text-Based User Interface (или библиотеки TUI) удовлетворяют эту потребность. Они переносят панели, ввод, вывод, поддержку мыши, графику и звук на ваш терминал.

Хорошо, тогда мы можем провести параллельный тест, пожалуйста?

К сожалению нет.

Первоначально я планировал параллельно оценить три-четыре библиотеки TUI для Go, используя определение примера приложения с определенным набором функций для тестирования. У меня было несколько требований к библиотекам: Они должны -

  • быть довольно полными библиотеками TUI, поддерживающими гибкие макеты, стандартные виджеты пользовательского интерфейса, такие как кнопки, меню, ввод текста, вывод текста, поддержка мыши и т. д.
  • предоставлять абстракции высокого уровня (в отличие от предоставления только низкоуровневых примитивов пользовательского интерфейса),
  • быть активными проектами (то есть последний коммит не должен быть датирован месяцами или даже годами назад),
  • пройти альфа-стадию и
  • иметь разумную документацию или образец кода. (Нет, документация по API не в счет. Я хотел хотя бы простое руководство по началу работы, охватывающее основы.)

Оказалось, что ни одна из найденных мной библиотек не соответствует всем требованиям.

Ну это все? Нет единой универсальной высокоуровневой графической библиотеки с достойной документацией?

Ну, нет, если вам действительно нужны все эти изящные функции пользовательского интерфейса одновременно. Однако, если вы можете отказаться от некоторых требований, в вашем распоряжении действительно есть небольшой выбор подходящих библиотек TUI, которые я кратко представлю ниже.

Только одно, прежде чем мы начнем.

Список является (и не может) быть полным. Я использовал GitHub.com, awesome-go.com, GolangLibs.com и LibHunt.com, чтобы найти библиотеки TUI, но все же нет гарантии, что я нашел там все соответствующие проекты.

Без подсказок парочки реддиторов в этой /r/golang ветке clui и wm возможно и проскочили бы.

И потом, конечно, приведенный выше список критериев — очень нечеткий фильтр, и вы могли включить библиотеку, которую я исключил из-за этого списка.

Но теперь давайте перейдем к обзору библиотеки TUI.

Базовые библиотеки TUI

Если вас устраивает создание пользовательского интерфейса на основе нескольких примитивов пользовательского интерфейса, есть две библиотеки, которые выглядят достаточно стабильными и полными:

nsf/termbox-go

termbox имеет небольшой и понятный API. Он использует двумерный буфер ячеек для представления экрана терминала с несколькими методами, такими как установка ячеек, очистка экрана или установка курсора. Все вводимые данные, будь то события клавиатуры, мыши или изменения размера, отслеживаются с помощью унифицированного типа событий.

Каким бы простым ни казался API, он не помешал другим создавать интересные проекты поверх termbox, в том числе TUI-библиотеки более высокого уровня (termui, gocui, tui-go и termloop`), простые игры, godit (текстовый редактор) и hecate (шестнадцатеричный редактор) и многое другое.

В README ничего не говорится о поддерживаемых платформах. Код включает несколько файлов syscall_*.go, что указывает на то, что termbox-go работает в Linux, macOS, Windows, OpenBSD, NetBSD, FreeBSD и Dragonfly BSD.

Сильные стороны

  • Большой выбор поддерживаемых платформ
  • Популярный базовый уровень TUI для ряда проектов TUI.

gdamore/tcell

По словам автора, tcell родилась из-за необходимости некоторых функций, которые termbox-go не предоставляет, и исправление termbox-go оказалось неподходящим способом продвижения вперед. tcell утверждает, что имеет несколько преимуществ по сравнению с termbox-go, включая дополнительную функциональность, лучшую переносимость, улучшенный ввод-вывод, лучшую поддержку мыши, Unicode, цветов и т. д. (Я не могу комментировать эти утверждения, так как я не тестировал ни termbox, ни tcell в полной мере.) tcell — это библиотека TUI, стоящая за Micro editor, и она также используется godu.

Согласно README, tcell работает в системах POSIX, которые предоставляют реализацию termios POSIX с /dev/tty, а также в Windows.

Требование «POSIX» включает Linux, macOS, FreeBSD и Solaris и, конечно же, другие системы, которые явно не указаны в README.

Сильные стороны

  • Широкий спектр поддерживаемых платформ
  • Богатый API

Библиотеки более высокого уровня

гизак/термуй

termui — это один из TUI высокого уровня, созданный на основе termbox-go. Он специализируется на отображении информации в графической форме - в виде гистограммы, линейной диаграммы, искровой линии или в виде датчика. Вывод текста также возможен, конечно. Пользовательский интерфейс построен на концепции виджетов или блоков, которые содержат ровно один тип представления данных — текст, диаграммы или диаграммы.

termui обеспечивает статический макет и макет сетки. Макет сетки может динамически реагировать на изменение размера окна терминала.

На стороне ввода termui предлагает простую систему обработки событий, которая может реагировать на нажатия клавиш, изменение размера окна или таймеры.

Чего не хватает в termui, чтобы сделать его полнофункциональным набором инструментов TUI, так это высокоуровневой обработки ввода (поля ввода, кнопки, меню, раскрывающиеся списки и т. д.). Я также пропустил какие-то панели с изменяемым размером, хотя макет сетки, вероятно, обеспечивает подходящую альтернативу этому.

На termui уже построено несколько проектов, в том числе ctop.

Сильные стороны

  • Богатый набор виджетов визуализации данных
  • Гибкая сетка из 12 столбцов с изменяемым размером

джроимартин/гокуи

Эта библиотека кажется почти противоположностью termui: нигде нет причудливых виджетов, но вместо этого строительные блоки для разделенных представлений, перекрывающихся представлений, редактируемых представлений и обработки событий для событий клавиатуры и мыши.

Сильные стороны

  • Режимы ввода текста
  • Макеты с изменяемым размером с помощью пользовательского обработчика перерисовки

Перспективные проекты

Я не мог не включить сюда следующие проекты, хотя они не соответствуют некоторым критериям включения. Тем не менее, они выглядят очень многообещающе и могут предложить ту или иную функцию, которую вы могли пропустить в этом списке.

ВладимирМаркелов/clui

Судя по скриншотам, это, пожалуй, самая красивая библиотека TUI в этом списке. Он также выглядит уже довольно продвинутым, с богатым набором виджетов пользовательского интерфейса, таких как кнопки, раскрывающиеся списки, датчики и т. Д., А также с управлением окнами и темами. Однако отсутствие документации (за исключением документов API) указывает на то, что работа над этим все еще продолжается.

Сильные стороны

  • Множество стандартных виджетов пользовательского интерфейса
  • Возможность работы в нескольких окнах, включая изменение размера и перекрытие

Чник/ВМ

Определенно работа продолжается, wm управляет перекрывающимися, изменяемого размера, украшенными окнами с прокручиваемым содержимым.

Сильные стороны

  • Несколько перекрывающихся окон

маркусолссон/туй-го

Составными блоками tui-go являются виджеты и макеты. Кажется, нет поддержки изменения размера блоков макета с помощью мыши, но каждый блок макета может предполагать одно из (в настоящее время) двух автоматических режимов изменения размера.

Сильные стороны

  • Простая компоновка с помощью горизонтально и вертикально расположенных блоков компоновки
  • Макет автоматически адаптируется к измененному размеру терминала
  • Поля ввода текста

терминпетля

Это особый вид TUI. termloop не является общей библиотекой TUI. Скорее, это специализированный инструментарий для консольных игр. Так что, возможно, вы не сможете создать «стандартный» пользовательский интерфейс приложения поверх него, но вы наверняка сможете заставить свои окна издавать звук при столкновении! 😉

Сильные стороны

  • Поддержка консольных игр

Код: библиотеки TUI на практике

Давайте попробуем две высокоуровневые библиотеки бок о бок! В приведенном ниже коде используются две библиотеки termui и gocui для создания минимального пользовательского интерфейса с простой компоновкой — похожей на компоновку на снимке экрана tui-go выше:

  • Список с фиксированной шириной, расположенный слева
  • Поле ввода текста с фиксированной высотой, расположенное внизу
  • Панель вывода общего назначения в оставшейся области

Если библиотека предоставляет виджет для ввода текста, введенный в него текст должен появиться на панели вывода.

Во-первых, импорт, константы и переменные, которые нам нужны для примера кода.

термуи

Начнем с termui.

termui организует свое содержимое как «блоки». Блоки можно размещать с использованием абсолютных координат или интегрировать в сетку из 12 столбцов. Макет сетки позволяет динамически регулировать ширину содержимого, когда пользователь изменяет размер окна терминала.

На данный момент автоматическая регулировка высоты недоступна, но возникла проблема с запросом этой функции.

Тестовый код обходит это ограничение, вручную пересчитывая высоту блока списка и блока вывода перед повторным выравниванием и повторным рендерингом пользовательского интерфейса.

Это было не слишком сложно, не так ли? Текстовая запись здесь отсутствует, так как termui еще не имеет элементов управления вводом. Тем не менее, реализация поля ввода возможна с помощью доступных методов API; см. подкаталог _example в репозитории termui. Это слишком много кода для этой статьи в блоге, поэтому я оставляю это упражнение читателю.

гокуи

Теперь посмотрим, как gocui решает ту же задачу.

Наша основная функция просто должна прочитать имя из библиотеки TUI из командной строки и выполнить соответствующий код.

Выводы из кода

Обе библиотеки имеют свои плюсы и минусы. Код termui кажется более кратким, но это может быть связано с отсутствием функции редактирования (которая добавила бы несколько строк кода), а также, возможно, с механизмом компоновки сетки, который сделал обработчик изменения размера двухстрочным.

Компоновка gocui, безусловно, более гибкая, но компромиссом является увеличение размера кода. Для ввода текста требуется всего несколько строк кода в gocui, тогда как визуализация данных — это то, где сияет termui.

Я оставляю решение за вами; возможно, вы даже предпочитаете низкоуровневую версию с termbox или tcell, или вы можете попробовать другие библиотеки TUI.

Как получить и запустить код

Шаг 1: go get код. Обратите внимание на флаг -d, который предотвращает автоматическую установку двоичного файла в $GOPATH/bin.

go get -d github.com/appliedgo/tui

Шаг 2: cd в каталог исходного кода.

cd $GOPATH/src/github.com/appliedgo/tui

Шаг 3. Запустите двоичный файл с параметром «termui» или «gocui».

go run tui.go termui go run tui.go gocui

Удачного кодирования!

Первоначально опубликовано на сайте appliedgo.net 2 апреля 2017 года. Присоединяйтесь к моему списку рассылки и будьте в курсе новых сообщений!