Salam, kolega!
Sekitar sebulan yang lalu, saya menerbitkan sebuah artikel tentang
kerangka kerja GUI di sini - di utas , yang menawarkan teknologi untuk membuat kerangka kerja GUI untuk berbagai bahasa pemrograman, berdasarkan menghubungkan (tcp / ip atau lainnya) ke proses eksternal yang memainkan peran semacam server GUI. Di sini saya ingin menyajikan implementasi konkret dari ide ini - kerangka kerja GUI baru untuk
Golang -
Eksternal .
Mengapa perlu untuk menulis GUI baru untuk
Golang , jika sudah ada banyak alat seperti itu tersedia? Pertama-tama, karena tidak ada yang cocok untuk saya sepenuhnya. Sesuatu diperlukan untuk membuat aplikasi desktop, cross-platform, sehingga terlihat alami untuk setiap platform. Jika mungkin, tidak terlalu besar, dengan ketergantungan minimum - saya berkomitmen pada pendekatan minimalis.
Saya dibimbing
oleh daftar ini . Dua posisi -
aplikasi dan
berjalan segera dicoret karena tidak memenuhi persyaratan lintas platform. Setelah beberapa pemikiran, ia menolak yang didasarkan pada html / css / javascript. Pertama, menurut saya agak tidak biasa untuk membangun aplikasi desktop sebagai halaman web dan, kedua, mereka menarik mesin yang cukup berat bersama mereka. Jadi, misalnya,
go-astilectron dan
gowd didasarkan pada
Electron dan
nw.js , masing-masing, dan ini, pada gilirannya, didasarkan pada
node.js. Bayangkan berapa banyak semuanya harus diinstal oleh pengguna akhir untuk menjalankan bahkan utilitas kecil? Kecuali
go-sctiter terlihat lebih disukai dari sudut pandang ini:
Sciter yang berdiri di belakangnya tidak begitu mengerikan.
Go-gtk dan
gotk3 didasarkan pada GTK. Ini, tampaknya, adalah paket yang dibuat secara menyeluruh, tetapi saya juga menolaknya, karena, menurut saya, menggunakan GTK di Windows bukanlah solusi terbaik. Jendela GTK tidak terlihat asli di bawah Windows.
Penjilidan Qt adalah hal yang kuat, tentu saja, tetapi agak rumit, dan dimensinya ... Ketika saya membaca: "Anda juga membutuhkan RAM gratis 2,5 GB (yang hanya diperlukan selama pengaturan awal) dan setidaknya ruang penyimpanan 5 GB gratis", keraguan terakhir menghilang. Pergi sendiri membutuhkan sepuluh kali lebih sedikit ruang. Dan kemudian ada pembatasan lisensi: "ini mengikat dengan lisensi LGPL tidak cocok untuk digunakan dalam aplikasi sumber tertutup yang dimaksudkan untuk didistribusikan kepada masyarakat umum".
Apa yang tersisa dari daftar?
Ui mungkin merupakan opsi yang baik, tetapi masih dalam tahap alpha-tengah.
Fyne juga terlihat cukup bagus, tetapi tampaknya tidak cukup siap. Agak memalukan bahwa, di satu sisi, "Fyne dibangun sepenuhnya menggunakan grafik vektor", dan, di sisi lain, "paket windows EFL saat ini jauh lebih tua sehingga Anda tidak akan melihat bagian grafik vektor aplikasi Fyne" - seperti ini. Yah, saya tidak seperti itu untuk menginstal
EFL (perpustakaan grafik yang menjadi basis
Fyne ) pada Windows, Anda memerlukan
MSYS .
Singkatnya, dengan segala hormat kepada penulis paket-paket ini dan produk-produk hasil kerja mereka, saya tidak memilih apa pun untuk diri saya sendiri dan, dengan hati nurani yang jelas, melanjutkan apa yang ingin saya lakukan - menulis kerangka kerja GUI baru -
Eksternal .
Seperti yang saya tulis di artikel sebelumnya,
Eksternal tidak mengimplementasikan elemen GUI sendiri, ia menggunakan aplikasi terpisah untuk ini, proses terpisah bertindak sebagai server GUI, aplikasi ini disebut
GuiServer . Peluncuran
eksternal , gabungkan melalui tcp / ip, kirim perintah / permintaan untuk membuat windows dan widget, memanipulasinya, dll., Dan menerima pesan darinya.
Ini adalah program sederhana yang membuat jendela dengan tulisan tradisional Hello, world:
package main import egui "github.com/alkresin/external" func main() { if egui.Init("") != 0 { return } pWindow := &egui.Widget{X: 100, Y: 100, W: 400, H: 140, Title: "My GUI app"} egui.InitMainWindow(pWindow) pWindow.AddWidget(&egui.Widget{Type: "label", X: 20, Y: 60, W: 160, H: 24, Title: "Hello, world!" }) pWindow.Activate() egui.Exit() }
Fungsi Init () memulai
GuiServer dan bergabung dengannya. Parameter string dapat diteruskan ke sana, yang menentukan, jika perlu, nama
GuiServer dan jalurnya, alamat ip dan port, dan tingkat logging.
InitMainWindow () membuat jendela aplikasi utama dengan parameter yang ditentukan. Metode AddWidget () - Menambahkan widget label jenis.
Activate () - menampilkan jendela di layar dan menempatkan program ke mode siaga.
Jendela dan widget didefinisikan dalam struktur Widget - karena saya tidak membuat struktur terpisah untuk setiap objek Saya tidak menemukan cara yang mudah untuk mengimplementasikan ini, mengingat
Go tidak memiliki warisan. Struktur ini mencakup bidang yang umum untuk sebagian besar widget, dan string peta [string], yang berisi properti khusus untuk objek tertentu:
type Widget struct { Parent *Widget Type string Name string X int [...] Font *Font AProps map[string]string aWidgets []*Widget }
Metode struktur ini termasuk AddWidget () yang familiar, serta SetText (), SetImage (), SetParam (), SetColor (), SetFont (), GetText (), GetText (), Move (), Enable (), dll. Saya ingin menyebutkan SetCallBackProc () dan SetCallBackFunc () - untuk mengatur event handler.
Tidak pantas mencantumkan semua fungsi, struktur, dan metode di sini, karena ini ada, lebih tepatnya. harus ada dokumentasi. Saya hanya akan mengatakan beberapa untuk memberikan gambaran umum:
Menu (), MenuContext (), EndMenu (), AddMenuItem (), AddMenuSeparator () - satu set fungsi untuk membuat menu, utama atau konteks.
EvalProc (sCode string), EvalFunc (sCode string) melewati fragmen kode Harbor (bisa multi-line) untuk dieksekusi di GuiServer - semacam implementasi bahasa skrip bawaan.
OpenForm (sPath string) - membuat jendela berdasarkan deskripsi dari file xml yang dibuat oleh HwGui Designer.
OpenReport (sPath string) - mencetak laporan berdasarkan deskripsi dari file xml yang dibuat oleh HwGui Designer.
MsgInfo (), ..., SelectFile (), SelectColor (), SelectFont () - memanggil kotak pesan standar dan dialog.
InitPrinter () dan seperangkat metode struktur Printer: Say (), Box (), Line (), dll. Menyediakan cetak ke printer dengan kemampuan untuk melihat pratinjau.
Berikut adalah daftar lengkap widget yang saat ini didukung:
label, edit, tombol, periksa, radio, radiogr, grup, kombo, bitmap, garis, panel (dirancang untuk meng-host widget lain di dalamnya), paneltop, panelbot, ownbtn (tombol yang ditarik pemilik), splitter, diperbarui, pohon, kemajuan, tab, jelajahi (tabel, sebanyak yang menyebutnya), cedit (edit dengan fitur canggih), bulanan.
Semuanya terdaftar dalam fungsi init () dari extwidg.go bersama dengan properti tambahan. dapat diakses untuk masing-masing - properti ini diatur melalui Widget.Props. Banyak dari widget ini memiliki properti lain, terutama yang kaya di dalamnya; mereka dapat diatur secara terpisah menggunakan metode SetParam ().
Eksternal ternyata kecil volumenya, ditulis murni
Go , tidak menarik paket lain kecuali beberapa yang standar. Cross-platform disediakan oleh
GuiServer , yang dapat dikompilasi di bawah Windows, Linux / Unix, Mac OS. Ketidaknyamanan tertentu dikaitkan secara tepat dengan kebutuhan untuk menggunakan modul eksternal ini, yang harus Anda kompilasi dari sumbernya, atau unduh yang sudah jadi dari situs saya dan letakkan di direktori yang ditentukan dalam PATH. Kebetulan, itu kecil - hanya sekitar satu setengah megabyte untuk Windows dan sekitar tiga - untuk Linux.
Bagaimana tampilannya, saya akan menunjukkan kepada Anda contoh aplikasi kecil
ETutor - tutorial Golang. Program ini menyajikan kumpulan fragmen kode on Go dalam bentuk pohon. Kode dapat diedit, dijalankan untuk dieksekusi. Tidak ada yang istimewa, tapi cukup nyaman. Koleksi dapat diisi ulang, tambahkan koleksi baru. Sekarang ada dikumpulkan (belum sepenuhnya) A Tour of Go, Go by Example dan beberapa contoh di
External itu sendiri.
ETutor juga dapat digunakan untuk, misalnya, mengatur satu set utilitas di Go. Jadi, tangkapan layar.
Windows 10:

Debian, Gnome:

Dan akhirnya, tautannya:
Eksternal di GithubGuiServer di GithubETutor di GithubHalaman tentang GuiServer di situs web saya tempat Anda dapat mengunduh binari yang sudah jadihttps://groups.google.com/d/forum/guiserver - Grup untuk membahas semua masalah yang terkait dengan GuiServer dan Eksternal
Artikel tentang GuiServer di Habré