GUI-Frameworks - pro Thread

Grüße, Kollegen!

Vor ein paar Monaten begann ich mich mit Golang zu beschäftigen, um es für Desktop-Anwendungen zu verwenden. Ich mochte die Sprache, den Umfang und das Thema der dafür geschriebenen Pakete, aber die Situation mit der GUI ist nicht so rosig. Ich werde jetzt nicht auf die Details eingehen, es wird genügen zu sagen, dass ich mich nach dem Lesen einiger Rezensionen und einem kurzen Blick auf die vorhandenen GUI-Pakete entschlossen habe, meine eigenen zu schreiben, zumal ich Erfahrung darin habe.

Mein erster Gedanke war, den bereits ausgetretenen Pfad zu beschreiten: Schreiben Sie eine Reihe entsprechender Funktionen in C oder passen Sie eine bereits fertige an - was ich einmal für Harbour und C ++ geschrieben habe, binden Sie sie mit cgo (C API für Golang) und freundliche Verpackung. Ich fing sogar an, dies zu tun, erhielt das erste Fenster, aber als ich mir vorstellte, wie viel Arbeit noch vor mir lag, getrennt für Windows, getrennt für Linux, rein technische Arbeit, da ich es bereits durchlaufen hatte, hatte sich meine Begeisterung etwas abgekühlt.

Und dann kam eine andere Idee.

Ich habe bereits eine GUI-Bibliothek, HwGUI for Harbor, eine recht funktionale, plattformübergreifende Bibliothek, die ich regelmäßig für meine Anwendungen verwende. Alles was ich brauche ist bereits darin implementiert. Warum nicht auf seiner Basis ein Programm schreiben, das als eine Art GUI-Server funktioniert? Nach dem Starten dieses Servers hört er still einen bestimmten Port ab und erstellt nach Erhalt einer Verbindung von meinem Golang-Programm Fenster und Widgets als Antwort auf seine Anforderungen, bearbeitet sie und gibt Feedback, wenn Ereignisse von Widgets auftreten - in einem Wort, Implementieren Sie eine GUI dafür. Alle Details der GUI-Implementierung auf niedriger Ebene befinden sich bereits in der Bibliothek für Windows - durch direkte Aufrufe von WinAPI, für Linux / Unix und wahrscheinlich für MacOs - über GTK. Darüber hinaus beabsichtige ich nicht, einen Server im wahrsten Sinne des Wortes zu erstellen. Er akzeptiert keine Verbindungen von verschiedenen Programmen - dies würde zusätzliche unnötige Schwierigkeiten mit sich bringen. Für jede Instanz des Golang-Programms wird eine separate Instanz des GUI-Servers gestartet, was die Aufgabe weiter vereinfacht. Im Allgemeinen besteht das Programm daher aus zwei Prozessen, von denen einer die Hauptaufgabe ausführt und der andere für die Schnittstelle verantwortlich ist.

Das entsprechende Paket für Go sollte die Init-Prozedur enthalten, mit der der GUI-Server gestartet und verbunden wird, sowie eine Reihe von Strukturen, Methoden und Funktionen zum Erstellen und Bearbeiten von Fenstern und Widgets. Der Hauptinhalt all dieser Funktionen besteht darin, Nachrichten eines bestimmten Formats (basierend auf JSON) an den Server zu senden und Nachrichten von diesem zu empfangen. Die Kommunikation wird über zwei TCP / IP-Ports unterstützt. Einer ist für das Senden von Anforderungen an den Server verantwortlich, der andere für das Empfangen von Signalen vom Server zur Ereignisverarbeitung (Klicken auf eine Schaltfläche, Schließen eines Fensters usw.). Die Aufgabe ist relativ einfach, das Paket selbst ist klein. Keine Notwendigkeit, cgo zu verwenden, keine Notwendigkeit, an Bibliotheken von Drittanbietern zu binden, alles Code in reinem Go. Die ausführbare Datei des Programms selbst und die ausführbare Datei des GUI-Servers sind alle.

Die Wahl von Harbor + HwGUI für die Implementierung des GUI-Servers ist für mich in erster Linie darauf zurückzuführen, dass dies meine "nativen" Tools sind, die einfachste und schnellste Lösung. Aber aus anderen Blickwinkeln ist dies eine gute Wahl. Hier meiner Meinung nach die Hauptvorteile:

  • plattformübergreifend „in the box“;
  • Was als natives Erscheinungsbild bezeichnet wird, da es sich unter Windows ausschließlich um WinAPI-Aufrufe handelt, unter Linux / Unix - GTK; Wie viel die "native" GTK für MacOs ist, weiß ich wirklich nicht.
  • Durch die Möglichkeit, Harbour als integrierte Skriptsprache zu verwenden, können Sie Codefragmente zur Ausführung auf den Server übertragen - beispielsweise Ereignishandler, mit denen das Hauptprogramm von einigen Implementierungsdetails entlastet werden kann. Darüber hinaus eignet sich Harbour für viele Dinge, zum Beispiel für die Arbeit mit DBF und einigen Datenbanken.
  • Druckimplementierung;
  • die Möglichkeit, vom Designer erstellte Bildschirmformulare (HwGUI-Dienstprogramm) zu verwenden. Diese Formulare werden im XML-Format gespeichert und können ohne Änderungen in jedem Betriebssystem verwendet werden, in dem der Server ausgeführt wird.
  • die Möglichkeit, vom selben Designer erstellte Berichtsformulare zum Drucken zu verwenden (auch in XML).

Kurz gesagt, ich habe damit begonnen und ein erheblicher Teil der Arbeit ist bereits abgeschlossen. Beide Projekte, GuiServer und das Golang External GUI Framework, befinden sich auf Github. Alle Links befinden sich am Ende des Artikels. Unten finden Sie einige Screenshots. Nichts Besonderes, nur Tests.

Dies ist ein einfaches Dialogfeld:


Und dies geschieht anhand eines Beispiels aus dem Buch Kernigan und Donovan:


Das Hauptziel der Projekte ist es nun sicherzustellen, dass dieses süße Paar, External und GuiServer, alles kann, was HwGUI kann. Nun, bei der Erstellung einiger realer Anwendungen mit Extern wird klar, was mehr benötigt wird.

Dies könnte das Ende sein, ich habe die Beschreibung des Golang-Pakets um ein anderes Mal verschoben. Aber die Hauptsache in diesem Artikel fängt gerade erst an. Schließlich kann die beschriebene Methode zur Implementierung eines GUI-Frameworks mit demselben GUI-Server für andere Sprachen verwendet werden. C, Python, Java, ..., sogar Perl und PHP (und warum nicht?) - siehe Titel des Artikels. Minimale Kosten - und eine ziemlich funktionierende GUI-Lösung ist fertig. Das Schwierigste für jede Sprache ist nicht die Implementierung eines Austauschs mit dem Server, sondern dass diese Lösung organisch in ihr Paradigma, in ihre interne Logik passt. Wenn jemand ein solches Framework für seine Sprache erstellen möchte, werde ich versuchen, alle möglichen Hilfestellungen bereitzustellen, um die erforderlichen Informationen zu erhalten und möglicherweise einige Funktionen zum GUI-Server hinzuzufügen.

Parallel zum Golang-Paket habe ich ein Analogon für Harbour erstellt, hauptsächlich zu Überprüfungs- / Debugging-Zwecken. Es ist unwahrscheinlich, dass ich ein Framework für Perl mache, aber für C oder C ++ ist es ziemlich wahrscheinlich. Und hier ist der Grund: Schließlich gibt es eine weitere interessante Funktion im Zusammenhang mit der Verwendung eines GUI-Servers, der auf einem anderen Computer ausgeführt werden kann. Das Hauptprogramm läuft auf einem Computer und seine Schnittstelle auf einem anderen. Hier sehen Sie sofort Optionen für die Verwendung dieses Falls:

  • Das Hauptprogramm läuft auf einem Linux / Unix-Server, auf dem die grafische Shell überhaupt nicht installiert ist.
  • Das Hauptprogramm wird auf dem Computer eines anderen Benutzers ausgeführt (mit einem bedingten Buchhalter in Ihrem Unternehmen), und Sie können es selbst verwalten, ohne es zu stören.
  • Das Hauptprogramm läuft auf einem Smartphone, und Sie graben sich von einem normalen Computer aus in seine Innenseiten ein.
  • Das Hauptprogramm läuft auf dem Controller, auf einigen Arduino, Raspberry oder deren Gegenstücken, auf denen möglicherweise kein normaler Monitor vorhanden ist. Verbinden Sie sich mit Ihrem Laptop - und los geht's.

Nun, für diese letzte Option wäre wahrscheinlich ein C-Framework für einen GUI-Server nützlich. Ich denke, diese Möglichkeit ist sehr vielversprechend.

Und zum Schluss die Links:

github.com/alkresin/guiserver - GuiServer auf Github
github.com/alkresin/external - Extern (Go-Paket) auf Github
www.kresin.ru/guisrv.html - Die GuiServer- Seite auf meiner Website. Hier können Sie vorgefertigte Binärdateien herunterladen
habr.com/post/198618 - Mein Artikel über Harbour ist hier auf Habré
en.wikipedia.org/wiki/Harbor - Hafen auf Wikipedia
www.kresin.ru/harbour.html - Hafenseite auf meiner Website
www.kresin.ru/hwgui.html - die HwGUI-Seite auf meiner Website

PS: Es ist klar, dass nur wenige Leute Harbour und HwGUI installieren werden, um GuiServer aus dem Quellcode zu erstellen. Daher veröffentliche ich die gesammelten Binärdateien regelmäßig auf der GuiServer-Seite meiner Website - für Windows, Debian 8 32-Bit, Ubuntu 18.04 64-Bit. Ich kann mich für Fedora versammeln, aber unter MacOs habe ich es leider nicht zu Fuß erreichbar.

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


All Articles