GUI Golang: GTK + 3

Saya memutuskan untuk menulis satu aplikasi desktop lintas platform di Go . Membuat versi CLI , semuanya berfungsi dengan baik. Ya, dan kompilasi silang di Go didukung. Semuanya baik-baik saja secara umum. Tetapi versi GUI juga dibutuhkan. Dan kemudian mulai ...


Golang gotk3


Pilihan perpustakaan (mengikat) untuk GUI


Aplikasi itu seharusnya cross-platform.
Oleh karena itu, ia harus dikompilasi di Windows , GNU / Linux, dan macOS .
Pilihan ada pada perpustakaan seperti itu:



Saya melemparkan kembali Electron dan kerangka kerja lain yang menyeret Chromium dan node.js bersama mereka, karena mereka menimbang cukup banyak dan juga memakan banyak sumber daya sistem operasi.


Sekarang sedikit tentang masing-masing perpustakaan.


gotk3


Penjilidan perpustakaan GTK + 3 . Cakupan jauh dari semua kemungkinan, tetapi semua hal penting ada.


Aplikasi ini dikompilasi menggunakan standar go build . Kompilasi lintas-platform dimungkinkan, dengan pengecualian macOS . Hanya dengan macOS yang dapat dikompilasi untuk OS ini, well, dengan macOS dapat dikompilasi untuk Windows + GNU / Linux juga .


Antarmuka akan terlihat asli dari GNU / Linux , Windows (Anda harus menentukan topik khusus). Untuk macOS tidak akan terlihat asli. Anda hanya bisa keluar kecuali topik mengerikan yang akan meniru elemen asli macOS .


ada resep / qt


Binding library Qt 5 . Dukungan untuk QML, widget standar. Secara umum, banyak orang menyarankan ini mengikat.


qtdeploy menggunakan perintah khusus qtdeploy . Selain platform desktop, ada juga yang mobile. Kompilasi silang dilakukan menggunakan Docker . Untuk sistem operasi, Apple hanya dapat dikompilasi dengan macOS .


Jika diinginkan, pada Qt, Anda dapat membuat antarmuka tampak asli pada OS desktop.


zserge / tampilan web


Perpustakaan, yang awalnya ditulis dalam bahasa C , penulis mengacaukannya ke banyak bahasa, termasuk Go . Tampilan web asli digunakan untuk menampilkan: Windows - MSHTML , GNU / Linux - gtk-webkit2 , macOS - Cocoa / WebKit . Selain kode on Go, Anda juga perlu menulis di JS , dan HTML akan berguna.


Itu dikompilasi dengan go build , cross- compilation dimungkinkan dengan xgo .


Ini dapat terlihat asli sebanyak yang dibolehkan oleh browser standar.


Pilihan


Mengapa saya memilih gotk3 ?


Dalam resep / qt, saya tidak suka sistem yang terlalu rumit untuk membangun aplikasi, mereka bahkan membuat perintah khusus.


zserge / webview tampaknya tidak buruk, tidak akan banyak, tapi tetap saja itu tampilan web dan mungkin ada masalah standar yang ada dalam aplikasi tersebut: mungkin ke suatu tempat untuk pergi ke suatu tempat. Dan ini bukan Electron , di mana Chromium canggih selalu disertakan, tetapi di beberapa Windows lama semuanya bisa berjalan. Dan selain itu, Anda juga harus menulis dalam JS .


Saya memilih gotk3 sebagai sesuatu yang rata-rata. Anda dapat membangunnya dengan go build standar, terlihat dapat diterima, dan memang saya suka GTK + 3 !


Secara umum, saya pikir semuanya akan sederhana. Dan apa sia-sia tentang Go, mereka mengatakan bahwa ia memiliki masalah dengan GUI . Tapi betapa salahnya aku ...


Memulai


Instal semuanya dari gotk3 ( gtk , gdk , glib , cairo ) untuk diri kita sendiri:


 go get github.com/gotk3/gotk3/... 

Juga, pustaka GTK + 3 itu sendiri harus diinstal pada sistem Anda untuk pengembangan.


GNU / Linux


Di Ubuntu :


 sudo apt-get install libgtk-3-dev 

Di Arch Linux :


 sudo pacman -S gtk3 

macOS


Melalui Homebrew :


  brew install gtk-mac-integration gtk+3 

Windows


Tidak sesederhana itu di sini. Instruksi resmi menyarankan menggunakan MSYS2 dan sudah melakukan semuanya. Secara pribadi, saya menulis kode pada sistem operasi lain, dan melakukan kompilasi silang untuk Windows di Arch Linux , yang saya harap akan segera ditulis.


Contoh sederhana


Sekarang kita menulis file kecil dengan kode main.go :


 package main import ( "log" "github.com/gotk3/gotk3/gtk" ) func main() { //  GTK. gtk.Init(nil) //    ,   //     "destroy"     //     win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL) if err != nil { log.Fatal("   :", err) } win.SetTitle(" ") win.Connect("destroy", func() { gtk.MainQuit() }) //         l, err := gtk.LabelNew(", gotk3!") if err != nil { log.Fatal("   :", err) } //     win.Add(l) //      win.SetDefaultSize(800, 600) //      win.ShowAll() //    GTK ( ).    //  gtk.MainQuit() gtk.Main() } 

Anda dapat mengkompilasi menggunakan perintah go build , dan kemudian menjalankan biner. Tapi kita jalankan saja:


 go run main.go 

Setelah memulai, kita mendapatkan jendela seperti ini:


Contoh sederhana tentang golang gotk3


Selamat! Anda mendapat aplikasi sederhana dari README gotk3 !


Lebih banyak contoh dapat ditemukan di Github gotk3 . Saya tidak akan membongkar mereka. Lebih baik kita melakukan sesuatu yang tidak ada dalam contoh!


Glade


Ada hal seperti itu untuk Gtk + 3 - Glade . Ini adalah desainer grafis untuk GTK + . Itu terlihat seperti ini:


Glade


Agar tidak secara manual membuat setiap elemen dan tidak menempatkannya nanti di suatu tempat di jendela menggunakan kode program, Anda dapat membuang seluruh desain di Glade . Kemudian simpan semuanya ke file * .glade yang mirip XML dan muat melalui aplikasi kita.


Instal Glade


GNU / Linux


Pada distribusi GNU / Linux, menginstal glade mudah. Di beberapa Ubuntu, itu akan menjadi:


 sudo apt-get install glade 

Di Arch Linux :


 sudo pacman -S glade 

macOS


Unduhan dari situs resmi sudah sangat lama dibuat. Karena itu, lebih baik menginstal melalui Homebrew :


 brew install glade 

Dan kemudian jalankan:


 glade 

Windows


Anda dapat mengunduh versi terbaru di sini . Saya pribadi tidak menginstalnya di Windows sama sekali, jadi saya tidak tahu tentang stabilitas Glade di sana.


Aplikasi sederhana menggunakan Glade


Secara umum, saya merancang sesuatu seperti jendela ini:


Glade


Disimpan dan menerima file main.glade :


 <?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.22.1 --> <interface> <requires lib="gtk+" version="3.20"/> <object class="GtkWindow" id="window_main"> <property name="title" translatable="yes"> Glade</property> <property name="can_focus">False</property> <child> <placeholder/> </child> <child> <object class="GtkBox"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="margin_left">10</property> <property name="margin_right">10</property> <property name="margin_top">10</property> <property name="margin_bottom">10</property> <property name="orientation">vertical</property> <property name="spacing">10</property> <child> <object class="GtkEntry" id="entry_1"> <property name="visible">True</property> <property name="can_focus">True</property> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkButton" id="button_1"> <property name="label" translatable="yes">Go</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkLabel" id="label_1"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">This is label</property> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">2</property> </packing> </child> </object> </child> </object> </interface> 

Yaitu, kami mendapat jendela window_main ( GtkWindow ), di mana di dalam wadah ( GtkBox ), yang berisi bidang input button_1 ( GtkButton ), button_1 ( GtkButton ) dan label_1 ( GtkLabel ). Selain itu, ada juga atribut bug (saya konfigurasikan sedikit), visibilitas dan atribut lainnya yang ditambahkan secara otomatis oleh Glade .


Sekarang mari kita coba memuat tampilan ini di main.go kami:


 package main import ( "log" "github.com/gotk3/gotk3/gtk" ) func main() { //  GTK. gtk.Init(nil) //   b, err := gtk.BuilderNew() if err != nil { log.Fatal(":", err) } //       Glade err = b.AddFromFile("main.glade") if err != nil { log.Fatal(":", err) } //      ID obj, err := b.GetObject("window_main") if err != nil { log.Fatal(":", err) } //       gtk.Window //     "destroy"     //     win := obj.(*gtk.Window) win.Connect("destroy", func() { gtk.MainQuit() }) //      win.ShowAll() //    GTK ( ).    //  gtk.MainQuit() gtk.Main() } 

Jalankan lagi:


 go run main.go 

Dan kita mendapatkan:


Golang glade gotk3


Hore! Sekarang kita memegang pengiriman formulir dalam file main.glade XML , dan kode di main.go !


Sinyal


Jendela memulai, tetapi mari kita tambahkan interaktivitas. Biarkan teks dari bidang input ketika Anda mengklik tombol masuk ke label.


Untuk melakukan ini, pertama-tama kita mendapatkan elemen dari bidang input, tombol, dan label dalam kode:


 //    obj, _ = b.GetObject("entry_1") entry1 := obj.(*gtk.Entry) //   obj, _ = b.GetObject("button_1") button1 := obj.(*gtk.Button) //   obj, _ = b.GetObject("label_1") label1 := obj.(*gtk.Label) 

Saya tidak menangani kesalahan yang mengembalikan fungsi GetObject() untuk membuat kode lebih sederhana. Tetapi dalam aplikasi kerja nyata, mereka harus diproses.


Bagus Dengan menggunakan kode di atas, kita mendapatkan elemen formulir kami. Sekarang mari kita menangani sinyal tombol yang clicked (ketika tombol ditekan). Sinyal GTK + pada dasarnya adalah reaksi terhadap peristiwa tersebut. Tambahkan kode:


 //      button1.Connect("clicked", func() { text, err := entry1.GetText() if err == nil { //       label1.SetText(text) } }) 

Sekarang jalankan kodenya:


 go run main.go 

Setelah memasukkan beberapa teks di bidang dan mengklik tombol Go , kita akan melihat teks ini di label:


Golang Glade mendapat sinyal gotk3


Sekarang kami memiliki aplikasi interaktif!


Kesimpulan


Pada tahap ini, semuanya tampak sederhana dan tidak sulit. Tetapi saya mengalami kesulitan dengan kompilasi silang (karena gotk3 dikompilasi dengan CGO ), integrasi dengan sistem operasi dan dengan dialog pemilihan file. Saya bahkan menambahkan dialog asli ke proyek gotk . Juga, proyek saya membutuhkan internasionalisasi. Ada juga beberapa fitur. Jika Anda tertarik melihat semua ini sekarang dalam kode, maka Anda dapat mengintip di sini .


Kode sumber untuk contoh-contoh dari artikel ada di sini .


Dan jika Anda ingin membaca sekuelnya, Anda dapat memilih. Dan jika ternyata menarik bagi seseorang, saya akan terus menulis.

Source: https://habr.com/ru/post/id420035/


All Articles