Создание desktop приложения с помощью Golang и Fyne

от автора

Сегодня мы будем разрабатывать desktop приложение на Golang

Разработка golang desktop приложения — не совсем типичная задача для golang программиста. Готовых open source библиотек для ее решения гугл по запросу golang desktop выдает не так уж и много, примеры того, что удалось найти:

  1. gotk
  2. Fyne
  3. 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.

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

image
А так выглядит golang windows приложение

В результате, получилось создать простое кроссплатформенное golang desktop приложение, и попробовать в действии Fyne. К сожалению, вряд ли стоит рассматривать go, как подходящий язык для разработки современных desktop приложений, однако, всегда интересно прикоснуться к чему-то новому и необычному на практике.

Всем спасибо за внимание.

ссылка на оригинал статьи https://habr.com/ru/post/497148/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *