Comments 58
brew install pkg-config gtk-mac-integration gtk+3
Хочется перевести проект с Си на Golang, но пока непонятно будет ли оно стоить. А дома времени на эксперименты почти нет.
Но надо отметить, что Visual Studio Code сделан как раз на Electron с TypeScript. И по сравнению с IntelliJ Idea весит гораздо меньше, да и память не так сильно жрёр. Это говорит о том, что Electron может быть лучше растолстевшего JVM.
Стереотип медленности Chromium и node.js (Electron + TypeScript) полагаю вызван существующим мнением что большая часть веб разработчиков все еще являются скрипт кидди.
Кроме того тащить в десктопный проект js и веб c их жуткой экосистемой имхо мазохизм
Для себя я сделал вывод что-то что сложенее 2-3 окон (например переключение между ними, диалоги, прогресс бары) на Go сделать довольно-таки сложно.
для установки:
go install -tags gtk_3_18 github.com/gotk3/gotk3/gtk
для сборки приложения:
go build -v -tags gtk_3_18 -gcflags "-N -l"
Это есть в issue проекта
Теги в gotk3 сделаны специально для старых версий.
То есть у вас устаревшая версия установлена. Какая у вас операционная система?
Сейчас перешёл на Mate и не увидел удобного визуального инструмента под GTK.
Есть Anjuta, но толком ни документации, ни примеров.
В итоге написал себе нужную программу на Python, но хочется, конечно, что-то нормально компилируемое.
С GO ни разу не сталкивался, но синтаксис вроде простой и понятный, надо будет пощупать.
Жаль что под линукс нет простого и понятного инструмента, типа Visual Studio.
Уважаемый автор, просьба дополни свою статья информацией о том что нужно будет иметь на компьютере пользователя чтобы пользоваться подобным приложением.
К примеру я разработчик, я загадил установил на свой мак home brew (на самом деле пользуюсь mac port именно чтобы не отчищать ...), поставил GTK и все что нужно для компиляции.
Сделал приложение и хочу его отдать пользователю(ям), пользователей не заставить ставить всякое не нужное им, чтобы такое приложение работало.
Поэтому опиши что нужно запаковать, как куда или ставить на пользовательский комп чтобы приложение работало на другом компьютере, исходя из того что пользовательский компьютер свеж и чист. Так как go кроссплатформенный, то для всех платформ.
Одно из прекрасных преимуществ приложений на go в том что они компилируются в статический бинарник не требующий ничего. В этом случае так же? Или нужно тащить с собой GTK?
Я помню был биндиг под Golang для QT, в том случае приходилось тащить тележку навоза в виде самого QT.
Если нужно тащить GTK, то зачем такое счастье? Например под mac вполне себе то же самое можно написать на swift, который очень похож на язык Golang и получить полноценное приложение без зависимостей. Или написать UI на атом или подобном, а внутрь встроить Golang приложение как внутренний сервер.
В чем преимущества описанного решения?
Про GTK не скажу, но Swift, как бы Вам не казалось, вместе с приложением бандлит весь Swift stdlib.
И так будет до тех пор, пока не разберутся с Swift ABI, а это хотели сначала к 3 версии сделать, потом к 4, сейчас к 5.
Вот в документации gotk3 про это: github.com/gotk3/gotk3/wiki/Cross-Compiling#deployment.
Под атомом вы имеете ввиду Electron? Я писал, что с ним тащится Chromium + node.js. Это не очень. Плюс ресурсов жрёт много.
Вот только недавно искал что взять для GUI в Go. Склонялся к Qt, т.к. с ним я знаком со времен разработки на PyQt, но отталкивала монструозность установки всего этого и дальнейшей компиляция.
При компиляции создается автономный бинарник или для его работы пользователю придется еще что то доставлять?
Нужны будут динамические библиотеки GTK+, их общий вес не сильно велик по нынещним меркам: github.com/gotk3/gotk3/wiki/Cross-Compiling#deployment. Я дальше об этом расскажу.
В общем я думал, что всё будет просто. И что зря про Go говорят, что в нём проблема с GUI. Но как же я ошибался...из статьи не понятно, причем от слова совсем, в чем же таки заключались проблемы и как их решали?!

package main
import (
"github.com/andlabs/ui"
)
func main() {
err := ui.Main(func() {
input := ui.NewEntry()
button := ui.NewButton("Greet")
greeting := ui.NewLabel("")
box := ui.NewVerticalBox()
box.Append(ui.NewLabel("Enter your name:"), false)
box.Append(input, false)
box.Append(button, false)
box.Append(greeting, false)
window := ui.NewWindow("Hello", 200, 100, false)
window.SetMargined(true)
window.SetChild(box)
button.OnClicked(func(*ui.Button) {
greeting.SetText("Hello, " + input.Text() + "!")
})
window.OnClosing(func(*ui.Window) bool {
ui.Quit()
return true
})
window.Show()
})
if err != nil {
panic(err)
}
}
отсюда: getting started


Это были лирические впечатления, а теперь вопросик. Это всё гуглится наверное, но всё же спрошу — есть ли у в gotk3 графики, грид-контрол и richtext-контрол?
Richtext-контрол — есть GtkTextView, тоже есть биндинг в gotk3 и пример. Там много возможностей по форматированию. Единственное, что придётся самому все контролы добавлять для этого и написать какой-то код для фоматирования текста.
А вот с графиками не всё так просто. Можно вручную всё рисовать с помощью Cairo, которая идёт с GTK и вроде бы есть биндинги в gotk3. Либо же использовать кастомный виджет (один из: gtkgraph.sourceforge.net/screenshots.html). Но для этого виджета скорее всего не будет биндинга для Go. Поэтому придётся самому биндинг писать. Если же вручную рисовать, то есть пример работы с графикой на gotk3.
Andrii@ANDRII-PC MINGW64 /d/Projects/GoGUI
$ go run main.go
go build github.com/gotk3/gotk3/gdk: invalid flag in pkg-config --libs: -Wl,-luuid
Andrii@ANDRII-PC MINGW64 /d/Projects/GoGUI
$ CGO_CFLAGS_ALLOW="-Wl,-luuid" go run main.go
go build github.com/gotk3/gotk3/gdk: invalid flag in pkg-config --libs: -Wl,-luuid
Ищите файлы mingw64\lib\pkgconfig\gdk-3.0.pc (mingw32\lib\pkgconfig\gdk-3.0.pc) и в строке:
Libs: -L${libdir} -lgdk-3 -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lwinmm -ldwmapi -lsetupapi -lcfgmgr32 -lz
просто удаляете "-Wl,", чтобы получилось:
Libs: -L${libdir} -lgdk-3 -lgdi32 -limm32 -lshell32 -lole32 -luuid -lwinmm -ldwmapi -lsetupapi -lcfgmgr32 -lz
Работает. Я на Windows компилировать 32-битное приложение. Вот тут его можете скачать: https://jhekasoft.github.io/insteadman/. Расскажу в продолжении подробнее.
Мне вот интересно, много ли в 2k18 32х разрядных осей/процов?
более того, они иногда пишут 2к18 (и тут даже увеличили кол-во байт).
но если серьезно, то это то же самое что "ну это такое", "тащемта", "сейчас бы в 2018 делать что-то" — мерзкая грязь в языке.
Ну тащемта это все используется в "разговорном" русском языке, помимо этого в нем используется куча других не литературных слов, в т.ч. и маты. Грязь это или нет — судить не буду. Энивей, все это используется для общения в неформальном стиле, а хабр все же для неформального общения.
Если же говорить про чистоту языка… Ну, я могу начать разговор про использование "кавычек" вместо «ёлочек» которые используются в русском языке… :)
Никто не идеален. Каждый пишет/говорит так как ему удобно или как он привык.
Надеюсь что ответил и walkman7
Лично я писал код на других операционных системах, а кросскомпиляцию для Windows делал в Arch Linux, о чём надеюсь скоро напишу.
Очень любопытна эта часть. Писал несколько прилаг с UI на GTK+ 3 и все компилил под Linux. Через какое-то время понадобились эти же приложения на Windows. Сколько я не бился, какие настроики не крутил, мне так и не удалось скомпилировать сие чудо под Windows. Пришлось потом в скором порядке переписывать на go-astilectron
Я компилировал как раз в той ОС, для которой есть описание установки mingw — ArchLinux. mingw и GTK-библиотеки под это компилятор собирались с исходников. Это очень длительный процесс, как там и описано. У меня примерно сутки всё компилилось. Я уже думал, где можно найти готовые бинарники. Но после того как скомпилились все либы компилить само приложение для Windows стало просто.
Я задумываюсь, что если мне придётся заново собирать mingw-библиотеки для GTK+, то это будет кошмар. Я даже задумывался, что может быть под самой Windows компиляция будет проще.
А вы не пробовали под Windows скомпилить по официальной инструкции: www.gtk.org/download/windows.php?
Если писать под Linux, то всё супер, буквально 3 команды и всё готово.
А в целом я перебрал практически все UI библиотеки из этого списка: github.com/avelino/awesome-go#gui
И лично для меня, gtk показался наиболее простым в понимании и близким по синтаксису. Да и UI элементов в ней довольно много, по сравнению с остальными аналогами
Расскажу в продолжении подробнее
Ну так что... уже навряд ли будет продолжение?)
GUI на Golang: GTK+ 3