Как стать автором
Обновить

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

Время на прочтение3 мин
Количество просмотров28K

Сегодня мы будем разрабатывать 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 приложений, однако, всегда интересно прикоснуться к чему-то новому и необычному на практике.

Всем спасибо за внимание.
Теги:
Хабы:
Всего голосов 4: ↑4 и ↓0+4
Комментарии7

Публикации

Истории

Работа

Go разработчик
125 вакансий

Ближайшие события