Grüße, Kollegen!
Vor ungefähr einem Monat habe ich hier einen Artikel über
GUI-Frameworks veröffentlicht - in einem Thread , der die Technologie zum Erstellen von GUI-Frameworks für verschiedene Programmiersprachen anbot, basierend auf der Verbindung (tcp / ip oder eine andere) mit einem externen Prozess, der die Rolle einer Art GUI-Server spielt. Hier möchte ich eine konkrete Umsetzung dieser Idee
vorstellen - ein neues GUI-Framework für
Golang -
External .
Warum musste eine neue GUI für
Golang geschrieben werden , wenn bereits viele solcher Tools verfügbar sind? Zuallererst, weil keiner von ihnen mir in vollen Zügen passte. Es war etwas erforderlich, um plattformübergreifende Desktop-Anwendungen zu erstellen, die für jede Plattform natürlich aussehen. Wenn möglich, nicht sehr sperrig, mit einem Minimum an Abhängigkeiten - ich bin einem minimalistischen Ansatz verpflichtet.
Ich wurde
von dieser Liste geführt . Zwei Positionen -
App und
Walk - wurden sofort durchgestrichen, da sie nicht den Anforderungen der plattformübergreifenden Anforderungen entsprachen. Nach einigem Überlegen lehnte er diejenigen ab, die auf html / css / javascript basierten. Erstens scheint es mir etwas ungewöhnlich, eine Desktop-Anwendung als Webseite zu erstellen, und zweitens ziehen sie ziemlich schwere Motoren mit sich. So basieren beispielsweise
go-astilectron und
gowd auf
Electron bzw.
nw.js , und diese wiederum basieren auf
node.js. Stellen Sie sich vor, wie viel alles vom Endbenutzer installiert werden muss, um auch nur ein kleines Dienstprogramm auszuführen? Es sei denn,
go-sctiter sieht aus dieser Sicht vorzuziehen: Der
dahinter stehende
Sciter ist nicht so monströs.
Go-gtk und
gotk3 basieren auf GTK. Anscheinend handelt es sich um gründlich erstellte Pakete, aber ich habe sie auch abgelehnt, da die Verwendung von GTK unter Windows meiner Meinung nach nicht die beste Lösung ist. GTK-Fenster sehen unter Windows nicht nativ aus.
Qt- Bindung ist natürlich eine mächtige Sache, aber ziemlich kompliziert, und die Abmessungen ... Als ich las: "Sie benötigen außerdem 2,5 GB freien RAM (der nur bei der Ersteinrichtung benötigt wird) und mindestens 5 GB freien Speicherplatz", verschwanden die letzten Zweifel. Go selbst nimmt zehnmal weniger Platz ein. Und dann gibt es Lizenzbeschränkungen: „Diese Bindung mit ihrer LGPL-Lizenz ist nicht für die Verwendung in Closed-Source-Anwendungen geeignet, die an die breite Öffentlichkeit verteilt werden sollen.“
Was haben wir von der Liste übrig?
Ui ist vielleicht eine gute Option, befindet sich aber noch im mittleren Alpha-Stadium.
Fyne sieht auch ziemlich gut aus, scheint aber nicht ganz fertig zu sein. Es war etwas peinlich, dass einerseits „Fyne vollständig mit Vektorgrafiken erstellt wurde“ und andererseits „EFL-Windows-Pakete derzeit viel älter sind, sodass Sie die Vektorgrafik-Teile von Fyne-Anwendungen nicht sehen“ - so. Das gefällt mir nicht, um
EFL (die Grafikbibliothek, auf der
Fyne basiert) unter Windows zu installieren, benötigen Sie
MSYS .
Kurz gesagt, bei allem Respekt vor den Autoren dieser Pakete und den Produkten ihrer Arbeit habe ich nichts für mich selbst ausgewählt und bin mit gutem Gewissen zu dem übergegangen, was ich tun wollte - ein neues GUI-Framework schreiben -
Extern .
Wie ich in einem früheren Artikel geschrieben habe, implementiert
External keine GUI-Elemente selbst, sondern verwendet hierfür eine separate Anwendung, einen separaten Prozess, der als GUI-Server fungiert. Diese Anwendung heißt
GuiServer .
Extern startet es, verbindet es über TCP / IP, sendet Befehle / Anforderungen zum Erstellen von Fenstern und Widgets, zum Bearbeiten von Fenstern usw. und empfängt Nachrichten von ihm.
Hier ist ein einfaches Programm, das ein Fenster mit der traditionellen Inschrift Hallo Welt erstellt:
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() }
Die Funktion Init () startet
GuiServer und verbindet ihn. Es kann ein Zeichenfolgenparameter übergeben werden, der bei Bedarf den Namen von
GuiServer und seinen Pfad, die IP-Adresse und den Port sowie die Protokollierungsstufe bestimmt.
InitMainWindow () erstellt das Hauptanwendungsfenster mit den angegebenen Parametern. Methode AddWidget () - Fügt ein Widget mit Typbezeichnung hinzu.
Activate () - Zeigt ein Fenster auf dem Bildschirm an und versetzt das Programm in den Standby-Modus.
Sowohl Fenster als auch Widgets sind in der Widget-Struktur definiert. Ich habe nicht für jedes Objekt separate Strukturen erstellt, da Ich habe keinen bequemen Weg gefunden, dies zu implementieren, da
Go keine Vererbung hat. Diese Struktur enthält Felder, die den meisten Widgets gemeinsam sind, und Map [String] -String, der Eigenschaften enthält, die für ein bestimmtes Objekt spezifisch sind:
type Widget struct { Parent *Widget Type string Name string X int [...] Font *Font AProps map[string]string aWidgets []*Widget }
Zu den Methoden dieser Struktur gehören das bekannte AddWidget () sowie SetText (), SetImage (), SetParam (), SetColor (), SetFont (), GetText (), Move (), Enable () usw. Ich möchte SetCallBackProc () und SetCallBackFunc () erwähnen - zum Festlegen von Ereignishandlern.
Es wäre unangemessen, hier alle Funktionen, Strukturen und Methoden aufzulisten, dafür gibt es genauer. Es muss eine Dokumentation vorhanden sein. Ich werde nur einige sagen, um eine allgemeine Vorstellung zu geben:
Menu (), MenuContext (), EndMenu (), AddMenuItem (), AddMenuSeparator () - eine Reihe von Funktionen zum Erstellen eines Menüs, eines Hauptmenüs oder eines Kontexts.
EvalProc (sCode-Zeichenfolge) und EvalFunc (sCode-Zeichenfolge) übergeben ein Harbor-Codefragment (kann mehrzeilig sein) zur Ausführung auf GuiServer - eine Art Implementierung der integrierten Skriptsprache.
OpenForm (sPath-Zeichenfolge) - Erstellt ein Fenster basierend auf der Beschreibung aus der von HwGui Designer erstellten XML-Datei.
OpenReport (sPath-Zeichenfolge) - druckt einen Bericht basierend auf der Beschreibung aus der von HwGui Designer erstellten XML-Datei.
MsgInfo (), ..., SelectFile (), SelectColor (), SelectFont () - Rufen Sie Standardnachrichtenfelder und -dialoge auf.
InitPrinter () und eine Reihe von Druckerstrukturmethoden: Say (), Box (), Line () usw. bieten dem Drucker die Möglichkeit, eine Vorschau anzuzeigen.
Hier ist die vollständige Liste der derzeit unterstützten Widgets:
Beschriften, Bearbeiten, Schaltfläche, Überprüfen, Radio, Radiogr, Gruppe, Combo, Bitmap, Linie, Bedienfeld (zum Hosten anderer Widgets), Paneltop, Bedienfeldbot, Ownbtn (vom Eigentümer gezeichnete Schaltfläche), Splitter, Aktualisierung, Baum, Fortschritt, Tab, Durchsuchen (Tabelle, wie viele es nennen), Cedit (Bearbeiten mit erweiterten Funktionen), Monthcal.
Alle von ihnen sind in der init () - Funktion von extwidg.go zusammen mit zusätzlichen Eigenschaften aufgeführt. Für jeden von ihnen zugänglich - diese Eigenschaften werden über Widget.AProps festgelegt. Viele dieser Widgets haben andere Eigenschaften, insbesondere das Durchsuchen. Sie können separat mit der SetParam () -Methode festgelegt werden.
Externes stellte sich als klein heraus, es ist in reinem
Go geschrieben , es zieht keine anderen Pakete außer ein paar Standardpaketen. Die plattformübergreifende Bereitstellung erfolgt durch
GuiServer , der unter Windows, Linux / Unix und Mac OS kompiliert werden kann. Eine gewisse Unannehmlichkeit ist gerade mit der Notwendigkeit verbunden, dieses externe Modul zu verwenden, das Sie entweder aus den Quellen kompilieren oder das fertige von meiner Site herunterladen und in das in PATH angegebene Verzeichnis ablegen müssen. Übrigens ist es klein - nur etwa eineinhalb Megabyte für Windows und etwa drei - für Linux.
Wie es aussieht, zeige ich Ihnen ein Beispiel für eine kleine
ETutor- Anwendung - das Golang-Tutorial. Dieses Programm präsentiert eine Sammlung von Codefragmenten auf Go in Form eines Baums. Der Code kann bearbeitet und zur Ausführung ausgeführt werden. Nichts besonderes, aber recht bequem. Die Sammlung kann aufgefüllt werden, neue Sammlungen hinzufügen. Jetzt gibt es (noch nicht vollständig) eine Tour of Go, Go by Example und einige Beispiele auf
External selbst.
ETutor kann
auch verwendet werden, um beispielsweise eine Reihe von Dienstprogrammen für
unterwegs zu organisieren. Also Screenshots.
Windows 10:

Debian, Gnom:

Und zum Schluss die Links:
Extern auf GithubGuiServer auf GithubETutor auf GithubEine Seite über GuiServer auf meiner Website, auf der Sie vorgefertigte Binärdateien herunterladen könnenhttps://groups.google.com/d/forum/guiserver - Eine Gruppe, in der alle Probleme im Zusammenhang mit GuiServer und Extern diskutiert werden
Artikel über GuiServer auf Habré