Сегодня мы будем разрабатывать desktop приложение на Golang
Разработка golang desktop приложения — не совсем типичная задача для golang программиста. Готовых open source библиотек для ее решения гугл по запросу golang desktop выдает не так уж и много, примеры того, что удалось найти:
- gotk
- Fyne
- GXUI
Выбран был Fyne, так как github-репозиторий этого проекта содержит наибольшее количество звездочек, а также он поддерживает небезызвестный Material design.
Посмотрим, какие возможности для отображения интерфейса он нам предоставляет.
Из коробки доступны следующие виджеты:
- Кнопка.
- Контейнер (для группировки дочерних виджетов и направления их по горизонтали или вертикали).
- Чекбокс, поля для ввода текста или пароля.
- Формы и группы.
- Гиперссылка.
- Иконка.
- Лейбл.
- Прогресс бар.
- Контейнер с поддержкой скролла.
- Переключатель.
- Select.
- Табы.
- Тулбар.
В случае, если среди элементов интерфейса нужного не нашлось, есть возможность реализовывать кастомные виджеты с помощью простого API.
Попробуем написать golang gui приложение для отображение прогноза погоды на ближайшие несколько дней с помощью Fyne. С полным кодом приложения можно ознакомиться по ссылке на github.
Первым делом, создадим пустой проект на Golang и установим Fyne.
go get fyne.io/fyne
Так как приложение будет отображать информацию о погоде, необходимо эту информацию получить. Для этого обратимся к Open Weather Map API.
func getWeatherForecast(result interface{}) error { var url = fmt.Sprintf("https://api.openweathermap.org/data/2.5/forecast?q=Voronezh&cnt=4&units=metric&appid=%s", openWeatherMapApiKey) // инициализируйте со своим ключом response, err := http.Get(url) if err != nil { fmt.Print(err) } defer response.Body.Close() return json.NewDecoder(response.Body).Decode(result) }
Для хранения данных можно использовать следующую структуру (в ней я оставил лишь некоторые из полей, которые возвращает API), стоит обратить внимание на то, что все поля структуры объявлены с большой буквы, но в ответе API они описаны с маленькой.
type WeatherInfo struct { List []WeatherListItem `json:list` } type WeatherListItem struct { Dt int `json:dt` Main WeatherMain `json:main` Weather []WeatherType `json:weather` } type WeatherMain struct { Temp float32 `json:temp` FeelsLike float32 `json:feels_like` Humidity int `json:humidity` } type WeatherType struct { Icon string `json:icon` }
Теперь мы можем получать данные о погоде в виде структуры. Остается реализовать интерфейс golang desktop приложения.
func setupUi(weatherInfo WeatherInfo) { app := app.New() w := app.NewWindow("Программа для просмотра погоды") var vBox = widget.NewVBox() // создаем новый контейнер с вертикальным порядком дочерних виджетов for i := 0; i < len(weatherInfo.List); i++ { var weatherForDay = weatherInfo.List[i] // погода дня для текущей итерации var weatherMainGroup = widget.NewVBox( widget.NewLabel(fmt.Sprintf("Температура: %.2f °C", weatherForDay.Main.Temp)), widget.NewLabel(fmt.Sprintf("Ощущается как: %.2f °C", weatherForDay.Main.FeelsLike)), widget.NewLabel(fmt.Sprintf("Влажность: %d%%", weatherForDay.Main.Humidity)), ) // отображаем 3 лейбла один под другим var weatherTypeGroup = widget.NewVBox() for weatherTypeI := 0; weatherTypeI < len(weatherForDay.Weather); weatherTypeI++ { var resource, _ = fyne.LoadResourceFromURLString(fmt.Sprintf("http://openweathermap.org/img/wn/%s.png", weatherForDay.Weather[weatherTypeI].Icon)) // создаем статический ресурс, содержащий иконку погоды var icon = widget.NewIcon(resource) weatherTypeGroup.Append(icon) } var time = time2.Unix(int64(weatherInfo.List[i].Dt), 0).String() vBox.Append(widget.NewGroup(time)) vBox.Append(widget.NewHBox(weatherMainGroup, weatherTypeGroup)) } vBox.Append(widget.NewButton("Закрыть", func() { app.Quit() })) w.SetContent(vBox) //устанавливаем контент для окна приложения w.ShowAndRun() // запускаем сконфигурированное приложение }
Здесь мы создаем наши виджеты, заполняем их данными и собираем их в группы для организации порядка их отображения.
Готово.
Остается только запустить приложение и посмотреть как оно выглядит. Так как фреймворк кроссплатформенный, можно запустить его, как на Windows, так и на macOS и Linux.

Запущенное golang mac os приложение

А так выглядит golang windows приложение
В результате, получилось создать простое кроссплатформенное golang desktop приложение, и попробовать в действии Fyne. К сожалению, вряд ли стоит рассматривать go, как подходящий язык для разработки современных desktop приложений, однако, всегда интересно прикоснуться к чему-то новому и необычному на практике.
Всем спасибо за внимание.
ссылка на оригинал статьи https://habr.com/ru/post/497148/
Добавить комментарий