Фреймворк Gtk пользуется достаточно большой популярностью среди разработчиков приложений. И вполне очевидно, что для популярного фреймворка должны существовать удобные и надежные инструменты разработки. Так и есть.

В этой статье хотелось бы рассказать о некоторых инструментах, которые я использую для создания приложений на Gtk. Рассматривать мы их будем на примере приложения Zodiac.

Zodiac — это приложение для составления гороскопов. Написано оно на языке Python и для генерации гороскопов использует библиотеку Kerykeion. Библиотека создает гороскопы в виде svg-файлов. Также можно получать гороскопы в текстовом виде (в табличном оформлении). Репозиторий программы можно найти здесь.

Зачем вообще понадобилось создавать это приложение? Насколько я знаю, для дистрибутивов GNU/Linux подобных приложений выпущено крайне мало. Лично я могу вспомнить только Maitreya. Из моих старых разработок похожим приложением можно назвать Astronum, но он не умеет строить гороскопы.

Для примера это приложение было выбрано из-за того, что большинство людей прекрасно знают, что такое гороскопы. Не нужно лишний раз пускаться в объяснения. В принципе, для этой статьи подошло бы несколько других приложений из моих репозиториев на GitHub.

GNOME Builder

Это официальная среда разработки приложений для среды рабочего стола GNOME. До нее таковой являлась Anjuta DevStudio. Сейчас она прекратила свое развитие, так как сильно устарела. Разработчики решили выпустить абсолютно новое приложение ей на замену.

Builder предлагает несколько готовых шаблонов приложений на разных языках программирования, среди которых C, C++, C#, Vala, Python, Rust и JavaScript. Есть возможность создавать приложения GNOME и приложения Gtk4. Разница между этими шаблонами в том, что в шаблоне для приложения GNOME уже встроена поддержка библиотеки libadwaita. В шаблоне для приложения Gtk4 поддержка libadwaita отсутствует.

Zodiac как раз использует шаблон приложения GNOME. Основной код находится в файле window.py. В нем расписана вся логика программы. Интерфейс описан в файле window.ui. Используется система сборки Meson. В принципе, шаблон содержит все необходимое, включая файлы для ресурсов и схем, файл описания и файл для значка запуска приложения.

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

Манифест получился довольно внушительный, так как для библиотеки Kerykeion, которая используется в приложении, нужно тащить много зависимостей. Подробнее о Kerykeion можно прочитать в последнем разделе статьи. Вот начало секции модулей манифеста:

"modules" : [
         {
    "name": "kerykeion",
    "buildsystem": "simple",
    "build-commands": [
        "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"kerykeion\" --no-build-isolation"
    ],
    "sources": [
        {
            "type": "file",
            "url": "https://files.pythonhosted.org/packages/16/2b/26b122b8947c4c47249926d7dc01543b0c456900bc8ead456b10c69a2316/kerykeion-4.1.1.tar.gz",
            "sha256": "4fa3a1360eccdd9592cee4438dcf578dc557514aa938c39cf443ae16dc6e787e"
        },
        {
            "type": "file",
            "url": "https://files.pythonhosted.org/packages/3a/cd/2f195cb564e0609efff7acdce27cb7b055f84f15eea28f9c92a1a0bc42a8/kerykeion-4.1.1-py3-none-any.whl",
            "sha256": "51ea95a38235682e03322c4ffdca6968270ca875d288af4cc005fa74a720e7d8"
        },
        {
            "type": "file",
            "url": "https://files.pythonhosted.org/packages/3b/9b/a7631bf35e55326fd74654fe6bd896478f47d65e97ca69e60ddb1b3823ee/pydantic-1.10.12.tar.gz",
            "sha256": "0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"
        },
        {
            "type": "file",
            "url": "https://files.pythonhosted.org/packages/7c/e0/2c957d4365c1ee5f9494697bc7c8655b39b5d4fc49619b17775680a3d86c/pydantic-1.10.12-py3-none-any.whl",
            "sha256": "b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"
        },
         {
            "type": "file",
            "url": "https://files.pythonhosted.org/packages/66/a6/db70d67a00dda42ebd033538c086879328f4c17f670eafe8aca2f11abfef/pyswisseph-2.10.3.2.tar.gz",
            "sha256": "c54c305e83dbd5d2b71e58d8a69d8ee41de24c4d3328ce09e2af860a3537624d"
        }

Так как опыта работы с python-библиотеками у меня практически нет, то составлять этот манифест пришлось методом научного тыка. То есть сначала прописываем файлы самой библиотеки kerykeion в самом начале раздела sources и жмем на кнопку запуска проекта. Builder нам напишет, что не хватает библиотеки pydantic, а после ее добавления в манифест и попытки повторного запуска проекта напишет, что не обнаружена pyswisseph, и так будет продолжаться до тех пор, пока все необходимые для работы библиотеки не будут прописаны в манифесте.

Cambalache

Это визуальный дизайнер для Gtk-приложений. Раньше, еще до появления Gtk4, был дизайнер под названием Glade. Он существовал в виде отдельного приложения, а также был встроен в среду Anjuta и в старые версии GNOME Builder, которые базировались на Gtk3. Теперь он, как и Anjuta, перестал развиваться. В новом инструменте есть возможность строить интерфейсы как для Gtk3, так и для Gtk4-приложений. В Cambalache можно работать и с компонентами из Gtk, и из Adw.

У Zodiac интерфейс довольно простой. На первой странице расположена форма для ввода информации о человеке, для которого строится гороскоп. В хидербаре есть выпадающий список. Там можно выбрать, для какого количества человек требуется составить гороскоп. Доступно составление гороскопа для одного или для двух человек.

В качестве основы в формах для ввода информации используется GtkListBox. В нем расположены AdwEntryRow для ввода, например, имени и AdwComboRow для выбора месяца. На первой странице в самом низу расположено поле для выбора места сохранения файла. В нем в виде встроенного виджета находится кнопка для открытия диалога выбора папки. Вот так это все выглядит:

Для выбора папки используется GtkFileDialog. Этот диалог работает в асинхронном режиме и может использовать порталы для доступа к файловой системе, из-за чего не нужно прописывать разрешение на этот доступ в манифесте. 

После заполнения всех полей можно увидеть готовый гороскоп:

Cambalache не всегда стабильно работает, и есть определенные проблемы с этим приложением. Например, он не всегда корректно открывает ui-файлы. Чаще всего окно вообще не появляется, хотя дерево компонентов в левой панели отображается как надо. Приложение работает со своим форматом файлов (.cmb), в который оно конвертирует ui-файлы. После того как интерфейс будет готов, происходит обратный процесс конвертации. То есть, чтобы открыть ui-файл его сначала нужно превратить в cmb-файл. Автоматически это почему-то не происходит.

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

Flatpak Builder, Poedit и кое-что еще

В GNOME Builder имеется встроенный flatpak-builder, но если он по какой-то причине перестанет работать или вам нужен более гибкий и настраиваемый вариант, то можно воспользоваться отдельно установленным пакетом. Также этот инструмент поставляется и в виде flatpak.

Для сборки и последующей установки приложения нужно скомандовать в консоли:

 flatpak-builder --force-clean --install --user /user-dir/projects-dir/zodiac-app /user-dir/projects-dir/zodiac/io.github.alexkdeveloper.zodiac.json

В случае успешного выполнения вышеприведенной команды приложение будет собрано и установлено с пользовательским типом установки. Подробно о том, как работать с этим инструментом, можно прочитать здесь.

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

Но на одном Poedit свет клином не сошелся. В качестве альтернативы можно использовать Lokalize от проекта KDE или GTranslator. Имеются и другие подобные инструменты. На этом сайте приводится список альтернативных программ для Poedit.

В шаблоне поставляются две иконки в формате svg. Одна — обычная, а другая символическая. Если вы собираетесь опубликовать ваше приложение на каком-либо ресурсе, то лучше всего озаботиться тем, чтобы иконки не нарушали авторские права. Можно самому попробовать сделать изображения, а если из вас дизайнер такой же, как и из меня, то можно скачать готовые со специальных сайтов. Я использую IconFinder и SVG Repo. Еще можно зайти в какой-нибудь тематический чат в Matrix. Например, в App Icon Design. Там можно обратиться к сообществу с просьбой помочь создать иконку.

Kerykeion

Библиотека довольно лаконичная. Собственно, такой и должна быть любая библиотека, претендующая на удобство использования. 

Для создания субъекта нужно воспользоваться классом AstrologicalSubject и передать ему необходимые аргументы:

subject = AstrologicalSubject(name, year, month, day, hours, minutes, place)

Чтобы создать объект с векторным изображением, надо использовать класс KerykeionChartSVG и передать ему субъект и тип гороскопа:

chart.set_output_directory(Path(path))
chart.makeSVG()

Для получения гороскопов в текстовом виде существует класс Report. Для создания необходимого объекта нужно всего лишь передать субъект на вход конструктора класса, а потом с помощью метода get_full_report изъять из полученного объекта строку:

report = Report(subject)
report_text = report.get_full_report()

Библиотеке необходим выход в интернет для доступа к сервису GeoNames, чтобы получить координаты места рождения человека. Чтобы избежать обращения к этому сервису, надо передать координаты прямо в конструктор субъекта:

kanye = AstrologicalSubject("Kanye", 1977, 6, 8, 8, 45, lng=50, lat=50, tz_str="Europe/Rome", city="Rome")

Все остальные процессы происходят локально и не требуют соединения с сетью. Подробнее с библиотекой можно ознакомиться здесь.

Для создания несложных приложений этих инструментов вполне достаточно. С другой стороны, любое такое приложение, наподобие Zodiac, можно написать и в простом блокноте. Но все-таки работать в нормальной IDE и с хорошим инструментарием гораздо удобнее, да и работа занимает намного меньше времени.


Автор статьи @KAlexAl

НЛО прилетело и оставило здесь промокод для читателей нашего блога:

-15% на заказ любого VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

Комментарии (0)