linux gtk что это
Руководство GTK# для начинающих
Оглавление
1. Предисловие
Эта статья является руководством для начинающих GTK# программистов. Она поможет тем, кто никогда до этого не программировал графические пользовательские интрфейсы (далее GUI) при помощи GTK#. Программисты ранее знакомые с GTK+ API из опыта написания на других языках (C, C++, Perl, Python) так же найдут этот пассаж полезным, т.к. он объясняет основы процесса создания приложений на C# в среде Mono. Эта статья так же рассказывает об основах использования Glade и libglade как быстрого инструмента создания графического пользовательского интерфейса.
1.1 Что такое GTK#?
Сегодня gtk+ работает с любым X сервером, Direct Framebuffer’ом и производными в Microsoft Windows NT. Библиотека gtk+ известна от Linux, где она является базисом для построения виджетов рабочей среды GNOME. gtk+ включен практически во все дистрибутивы Linux, и стабильно работает под управлением Windows NT. (в 2000 работала нестабильно, если мне память не изменяет)
Портирование gtk+ на Mac OS X запланированно, но необходима заинтересованность других людей. Это зов к участию.
2. Установка
2.1 Скачивание/Установка
Linux, MacOSX, FreeBSD и другие: Проверьте наличие требуемых пакетов gtk-sharp, mono в вашем дистрибутиве.
aptitude install mono gtk-sharp2
для Debian-based дистрибутивов.
В SuSE Linux выберите нужные пакеты в YaST. Если их нет в дистрибутиве, тогда ищите здесь(http://www.mono-project.com/Downloads) и загружайте. Если на mono-project.com нет пакетов для Вашей платформы, тогда Вам придется скомпилировать из исходников 😉
Windows: программируйте Windows.Forms, не хрен лезть в GTK =) [примечание автора]
2.2 Внутри библиотек GTK#
Компоненты GTK#
GTK# состоит из следующих сборок, каждая соответствует подобной библиотеке:
gtk-sharp (http://www.mono-project.com/monodoc/N:Gtk)
Связи тулкита gtk+ 2.x для создания GUI
glib-sharp (http://www.mono-project.com/monodoc/N:Glib)
Связи тулкита glib 2.x, которые обеспечивают низкоуровневое библиотеки ядра для gtk+ (не-GUI)
pango-sharp (http://www.mono-project.com/monodoc/N:Pango)
Связи Pango, высокоуровневая библиотека компоновки и рендеринга международных текстов
atk-sharp (http://www.mono-project.com/monodoc/N:Atk)
связи к atk фреймворку
gdk-sharp (http://www.mono-project.com/monodoc/N:Gdk)
низкоуровневый инструментарий для «рисования», используемый gtk+
glade-sharp (http://www.mono-project.com/monodoc/N:Glade)
Glade# позволяет Вам загружать интерфейсы Glade в программу. Это наиболее простой путь создания GTK# GUI.
art-sharp (http://www.mono-project.com/monodoc/N:Art)
библиотека для работы с векторной графикой и отрисовки
rsvg-sharp (http://www.mono-project.com/monodoc/N:Rsvg)
gtk-dotnet (http://www.mono-project.com/monodoc/N:Gtk.DotNet)
интеграция пространства имен Gtk# с System.Drawing
gnomevfs-sharp (http://www.mono-project.com/monodoc/N:GnomeVfs)
связи файлов, их MIME типов, изображений к методу обращения приложений GNOME’а к файловой системе
vte-sharp (http://www.mono-project.com/monodoc/N:Vte)
связи к терминальному эмулятору VTE
gconf-sharp (http://www.mono-project.com/monodoc/N:GConf)
Связи к системе хранения конфигураций в GNOME
gtkhtml-sharp (http://www.mono-project.com/monodoc/T:Gtk.HTML)
Связи к легковесному HTML виджету
Другие компоненты не включены в основной дистрибутив GTK#, но заслуживают упоминания, потому что имеют отношение к GTK#: Gecko#, Gtksourceview#, Gsf#, Guile#, Gst# и dbus#.
2.3 GTK# или Glade#
Для быстрого ознакомления с Glade# Вы возможно захотете взглянуть на этот скринкаст(http://nat.org/demos/gtksharp.html) Ната Фридмана (Nat Friedman)(http://nat.org), в котором он создает простое графическое приложение всего за несколько минут.
3. Первое GTK# приложение
Шаг 1. Присядьте удобнее
Шаг 2. Создание папок и файлов
Для начала нам нужно создать новую директорию для маленького проекта. (Пользователи Windows: давайте не будем использовать пробелы в названии директории, чтобы избежать в дальнейшем головной боли).
Вернемся к делу. Откройте свой любимый редактор (MonoDevelop, vi, emacs, notepad и т.д.) и создайте новый пустой проект (если это возможно) или создайте новый пустой файл. Сохраните файл под именем «helloworld.cs».
Шаг 3. Формирование кода
Я надеюсь, что Вы уже знакомы с C#, и код написанный ниже не вызовет никаких проблем в понимании. Мы должны создать новый класс, использовать Gtk# и указать точку входа в нашу программу. Это будет выглядеть так:
Это должно выглядеть весьма знакомо для Вас. Только теперь мы можем воспользоваться компилятором. Сохраним исходный код, перейдем в консоль и построим проект:
Шаг 4. Добавление графического интерфейса GUI
Теперь скомпилируем исходный код так же как мы делали это раньше, и запустим программу
В итоге вы получите что-то вроде этого:
Не так уж и сложно, да?
Другая часть кода, которая могла Вас заинтересовать, это использование выражений «Application.Init()» и «Application.Run()». Если вы когда-либо ранее использовали System.Windows.Forms это аналогично использованию «Application.Run()» во многих случаях. Обычно, когда приложения заканчивает обработку любого кода в основном потоке, приложение останавливается. Команда «ShowAll()» не блокирует код и продолжает дальнейшее выполнение кода (вплоть до остановки). Команда «Application.Init()» говорит оболочке выполнения «слушать» сигналы поступающие от Gtk.Windows и в момент когда выполняется «Application.Run()» выполнение кода передается основному циклу сообщений. Это позволяет оставаться приложению запущенным до тех пор пока не будут закрыты все окна. Для большей информации смотрите информацию об объекте Application.
Шаг 5. Формирование окна
Возможно Вы захотите спросить себя «Как я смогу добавить новый виджет на окно, если оно может содержать только один виджет?» До этого мы говорили, что Window действительно может содержать в себе только один виджет, но виджет сам по себе может содержать в себе множество других виджетов. Некоторые из этих виджетов наследуются от контейнера Gtk.Box, а в некоторых случаях напрямую от контейнера. Контейнерный виджет Bin наследуется напрямую от виждета-контейнера, как и многие другие виджеты, но Bin может содержать в себе только один элемент управления.
Для того чтобы размещать большое количество виджетов в нашем окне, мы должны добавить на окно один из виджетов, который может содержать в себе другие виджеты. Существует множество виджетов, которые могут делать это, но мы затронем только некоторые простые: HBox(http://www.go-mono.com/docs/index.aspx?link=T%3aGtk.HBox), VBox(http://www.go-mono.com/docs/index.aspx?link=T%3aGtk.VBox) и возможно Table(http://www.go-mono.com/docs/index.aspx?link=T%3aGtk.Table).
Шаг 6. Добавление событий
Многие их этих событий могут быть обработаны стандартным обработчиком событий. Например:
public static void HandlerMethod(object obj, EventArgs args)
Пример обработки событий нажатия на кнопку:
public static void ButtonPressHandler(object obj, ButtonPressEventArgs args)
Например, для использования события Gdk.Event мы можем использовать такой код:
В примере выше вы можете увидеть как обнаружить было ли одиночное нажатие мышкой или это был двойной клик.
4. Первое Glade# приложение
Шаг 1. Что такое Glade#
4.1.1 Что такое glade файлы?
Шаг 2. Интеграция glade файлов с нашей программой
В намерениях нашего примера мы предпологаем, что GUI был сохранен в файл gui.glade, который содержит описание окна window1, кнопки button1 и метки label1.
Нам нужно будет создать новый указатель на Gtk# и Glade#, а затем создать новый класс и точку входа, с которой начинается наша программа.
4.2.1 Как скомпилировать?
Теперь мы должны скомпилировать исходный файл glade.cs указывая пространство имен для glade, которое находится в библиотеке glade-sharp. Команда компиляции следующая:
Если мы запускаем программу наш GUI может открыться, однако, нажимая на кнопки Вы не добьетесь эффекта, потому как мы не назначали событий виджету, определенному в gui.glade файле. Изучив следующую секцию Вы научитесь это делать.
Шаг 3. Как использовать Glade# в моем коде
4.4 Как обращаться к виджетам определенным в gui.glade
Для доступа к объектам, определенным в gui.glade файле, Вы должны знать имя объекта и его тип, и только тогда добавлять его в C# код. Делается это следующим образом (обратите внимание на оттрибут [Widget]):
Применяем это определение к нашему примеру как следует ниже в коде:
4.5 Как добавить событие
Для добавления событий Вам необходимо следовать примеру кода ниже. Вы также можете добавлять события из Glade.
Введение в GTK+
Теперь, когда вы познакомились с системой X Window System, самое время рассмотреть комплект инструментальных средств GTK+ Toolkit. GTK+ появился на свет как часть популярного графического редактора GNU Image Manipulation Program (GIMP), от которого он и унаследовал свое имя (The Gimp ToolKit). Очевидно, что программисты GIMP всерьез предвидели превращение GTK+ в самостоятельный проект, поскольку он вырос и стал один из самых мощных и популярных комплектов инструментов. Домашнюю страницу проекта GTK+ можно найти по адресу https://www.gtk.org/.
В итоге, GTK+ — это библиотека, которая существенно упрощает создание графических интерфейсов пользователя (Graphical User Interface, GUI), предоставляя набор готовых компонентов, именуемых виджетами которые вы соединяете вместе с помощью легких в использовании вызовов функций, включенных в логическую структуру вашего приложения
Несмотря на то, что GTK+ — это проект GNU, как и GIMP, он выпущен на условиях более либеральной лицензии (Lesser General Public License, Стандартная общественная лицензия ограниченного применения GNU), которая освобождает программное обеспечение (включая патентованное программное обеспечение с закрытым программным кодом), написанное с использованием GTK+, от уплаты лицензионных вознаграждений или авторских гонораров, а также других ограничений.
Комплект GTK+ целиком написан на языке C и большая часть программного обеспечения GTK+ также написана на C. К счастью, существует ряд привязок к языкам (linguage binding), позволяющих применять GTK+ в предпочитаемом вами языке программирования, будь то C++, Python, PHP, Ruby, Perl, C# или Java.
Комплект GTK+ сформирован как надстройка для ряда других библиотек. К ним относятся следующие:
GLib — предоставляет низкоуровневые структуры данных, типы, поддержку потоков, циклов событий и динамической загрузки;
GObject — реализует объектно-ориентированную систему на языке C, не требующую применения языка C++;
Pango — поддерживает визуализацию и форматирование текста;
ATK — помогает создавать приложения с доступом и возволяет пользователям запускать ваши приложения с помощью средств чтения экрана и других средств доступа;
GDK (GIMP Drawing Kit) — обрабатывает визуализацию низкоуровневой графики поверх библиотеки Xlib;
GdkPixbuf — помогает манипулировать изображениями в программах GTK+;
Cairo — библиотека для отрисовки векторной графики;
Xlib — предоставляет низкоуровневую графику в системах Linux и Unix.
Система типов Glib
GLib и GObject помогают межплатформным разработкам, обеспечивая стандартный набор типов данных замещения, функций и макросов для поддержки управления памятью и общих задач. Эти типы, функции и макросы означают, что, как программисты GTK+, мы можем быть уверены в том, что наш программный код надежно переносится на другие платформы и архитектуры.
В библиотеке GLib также определено несколько очень удобных констант:
Дополнительные типы данных — это типы, служащие заменой для стандартных типов данных C (из соображений совместимости и читабельности) и гарантирующий одинаковый размер в байтах на всех платформах:
gpointer — синоним типа (void *) ;
gboolean — полезен для представления логических значений и служит оболочкой для int ;
Система объектов GTK+
Все, у кого уже есть опыт программирования GUI, возможно, поймут наше утверждение о строгой приверженности библиотек GUI концепции объектно-ориентированного программирования (ООП), настолько строгой, что все современные комплекты инструментов, включая GTK+, написаны в стиле объектно-ориентированного программирования.
Несмотря на то, что комплект инструментов GTK+ написан на чистом C, он поддерживает объекты и ООП благодаря библиотеке GObject. Эта библиотека поддерживает наследование объектов и полиморфизм с помощью макросов.
Вы применяете макрос GTK_CONTAINER для приведения типов GtkWidget и GtkContainer :
Назначение этих функций вы узнаете позже; сейчас просто отметьте для себя частое применение макросов. Для каждого возможного приведения типа существует макрос.
Не беспокойтесь, если вам всё это не очень понятно; вам не нужно разбираться в подробностях ООП для того, чтобы освоить GNOME/GTK+. На самом деле это безболезненный способ усвоить идеи и преимущества ООП на базе знакомого вам языка C.
Знакомство с GNOME
GNOME — имя, данное проекту, начатому в 1997 г. программистами, работавшими в проекте GNU Image Manipulation Program (GIMP) над созданием унифицированного рабочего стола для Linux. Все были согласны с тем, что выбор ОС Linux как платформы рабочего стола тормозился отсутствием согласованной стратегии. В то время рабочий стол Linux напоминал Дикий Запад без общих стандартов или выработанных на практике приемов, и программисты могли делать всё, что вздумается. Без свободной группы, контролирующей меню рабочего стола, согласованное представление и отображение, документацию, трансляцию и т. д., освоение рабочего стола новичком было в лучшем случае путанным, а в худшем — непригодным.
Группа GNOME намеривалась создать рабочий стол для ОС Linux с лицензией GPL, разрабатывая утилиты и программы настройки в едином согласованном стиле, одновременно способствуя развитию стандартов для взаимодействия приложений, печати, управления сеансами и лучших приёмов в программировании GUI приложений.
Результаты их стараний очевидны: среда GNOME — основа стандартного рабочего стола Linux в дистрибутивах Debian, Fedora, Red Hat, Ubuntu и др. (рис. 1).
Рис. 1. Обзор активности в GNOME 3
Первоначально название GNOME означало GNU Network Object Model Environment (среда сетевых объектных моделей GNU), что отражает одну из ранее поставленных задач, внедрение в систему Linux объектной интегрированной системы, такой как Microsoft OLE, для того, чтобы вы могли, например, встроить электронную таблицу в документ текстового процессора. Теперь поставлены новые задачи, и то, что сегодня нам известно как GNOME, — это законченная вреда рабочего стола, содержащая панель для запуска приложений, комплект программ и утилит, библиотеки программирования и средства поддержки разработчиков.
Перед тем как начать программировать, следует убедиться в том, что все необходимые библиотеки установлены.
Установка библиотек разработки GTK+
В дистрибутиве Debian и основанных на Debian системах, таких как Ubuntu, вы можете использовать программу apt (или apt-get ) для установки пакетов GTK+ с разных сайтов-зеркал (mirrors). Так для установки библиотек разработки GTK+ будет команда:
Рис. 2. gtk3-demo — демонстрационное приложение GTK+
Для каждого виджета отображаются вкладки Info (Информация) и Source (Исходный код). На вкладке Source приведен программный код на языке C для применения данного виджета. На ней может быть представлено множество примеров.
Пример: Обычное окно GtkWindow
Давайте начнем программирование средствами GTK+ с простейшей из программ GUI — отображения окна. Вы увидите библиотеку GTK+ в действии и большой набор функциональных возможностей, получаемых из очень короткого программного кода.
Введите программу и назовите её gtk1.c :
Для компиляции gtk1.c введите следующую команду:
Будьте внимательны и набирайте обратные апострофы, а не обычные апострофы — помните о том, что обратные апострофы — это инструкции, заставляющие оболочку выполнить заключенную в них команду и добавить ее вывод в конец строки.
Когда вы выполните программу с помощью следующей команды, ваше окно должно раскрыться (рис. 3).
Рис. 3. Обычное окно GtkWindow
Учтите, что вы можете перемещать окно, изменять его размер, сворачивать и раскрывать его на весь экран.
Как это работает
Параметр type может принимать в зависимости от назначения окна одно из двух значений:
GTK_WINDOW_TOPLEVEL — стандартное окно с рамкой;
GTK_WINDOW_POPUP — окно без рамки, подходящее для диалогового окна.
Вызов gtk_window_new создает окна в памяти, таким образом у вас появляется возможность перед реальным выводом окна на экран заполнить его виджетами, изменить размер окна, его заголовок и т. д. Для того чтобы окно появилось на экране, выполните вызов функции gtk_widget_show :
Установка платформы GTK #
Прежде чем начать, создайте новое Xamarin.Forms решение или используйте существующее Xamarin.Forms решение, например Xamarin.Forms.
хотя в этой статье рассматривается добавление приложения GTK # в Xamarin.Forms решение в VS2017 и Visual Studio для Mac, его также можно выполнить в Xamarin.Forms для Linux.
Добавление приложения GTK #
выполните эти инструкции, чтобы добавить приложение GTK #, которое будет выполняться на рабочем столе Windows:
проекта GTK Добавление нового проекта
в обозреватель решенийщелкните правой кнопкой мыши новый проект GTK и выберите пункт управление NuGet пакетами. Перейдите на вкладку Обзор и выполните поиск 3,0 или более.
Xamarin. forms
NuGet пакет «title =» выберите Xamarin.Forms NuGet пакет «data-переадресная сборка =» относительный путь «/>
Выберите пакет и нажмите кнопку » установить «.
Теперь найдите . Пакет Platform. GTK 3,0 или более поздней версии.
Выберите пакет и нажмите кнопку » установить «.
в обозреватель решенийщелкните правой кнопкой мыши имя решения и выберите пункт управление пакетами NuGet для решения. Выберите вкладку Обновление и пакет. Выберите все проекты и обновите их до той же Xamarin.Forms версии, которая используется в проекте GTK.
на общий проект
В диалоговом окне Диспетчер ссылок нажмите кнопку Обзор и перейдите в папку C:\Program Files (x86) \GtkSharp\2.12\lib и выберите atk-sharp.dll, gdk-sharp.dll, glade-sharp.dll, glib-sharp.dll, gtk-dotnet.dllи gtk-sharp.dll файлов.
В проекте GTK переименуйте Class1. CS в Program. CS.
Этот код инициализирует GTK # и Xamarin.Forms создает окно приложения и запускает приложение.
В Обозреватель решенийщелкните правой кнопкой мыши проект GTK и выберите пункт свойства.
в окне свойства перейдите на вкладку приложение и измените раскрывающийся список тип выходных данных на Windows приложение.
В Обозреватель решенийщелкните правой кнопкой мыши проект GTK и выберите назначить Project запуска. нажмите клавишу F5, чтобы запустить программу с помощью отладчика Visual Studio на рабочем столе Windows:
Игровая игра жизнь
Выполните эти инструкции, чтобы добавить приложение GTK #, которое будет выполняться на рабочем столе Mac:
в Visual Studio для Mac щелкните решение правой кнопкой мыши Xamarin.Forms и выберите Xamarin.Forms.
в Панель решениящелкните правой кнопкой мыши пакеты добавить пакеты. для проекта GTK и добавьте пакет NuGet предварительной версии 3,0 или выше.
Xamarin. forms
NuGet пакет «title =» выберите Xamarin.Forms NuGet пакет «data-переадресная сборка =» относительный путь «/>
Обновите другие проекты платформы для использования той же Xamarin.Forms версии, которая используется в проекте GTK.
В панель решениящелкните правой кнопкой мыши ссылки изменить ссылки. для проекта GTK и добавьте ссылку на проект (.NET Standard или Shared Project).
на общий проект
Измените файл Program. CS проекта GTK, чтобы он соответствовал следующему коду:
Этот код инициализирует GTK # и Xamarin.Forms создает окно приложения и запускает приложение.
В панель решениящелкните правой кнопкой мыши проект GTK и выберите назначить Project запуска.
на панели инструментов Visual Studio для Mac нажмите кнопку пуск (треугольная кнопка, напоминающая кнопку воспроизведения), чтобы запустить приложение.
Игровая игра жизнь
Next Steps
Особенности платформы
Вы можете определить, на какой платформе Xamarin.Forms выполняется приложение, с помощью XAML или кода. Это позволяет изменять характеристики программы при выполнении в GTK #. В коде Сравните значение Device.RuntimePlatform с Device.GTK константой (которая равна строке «GTK»). При наличии совпадения приложение будет выполняться в GTK #.
В XAML можно использовать OnPlatform тег для выбора значения свойства, характерного для платформы:
Значок приложения
Значок приложения можно задать при запуске:
Для GTK # доступны разнообразные темы, которые можно использовать из Xamarin.Forms приложения:
Собственные формы
Собственные формы позволяют Xamarin.Forms ContentPage использовать производные страницы в собственных проектах, включая проекты GTK #. Это можно сделать путем создания экземпляра страницы, производной от класса, ContentPage и преобразования ее в собственный тип GTK # с помощью CreateContainer метода расширения:
Дополнительные сведения о собственных формах см. в разделе собственные формы.
Проблемы
Это предварительная версия, поэтому следует рассчитывать на то, что все готово к производству. Сведения о текущем состоянии реализации см. в разделе состояние, а для текущих известных проблем см. раздел незавершенные Известные проблемы.