外部-GolangのGUI

ご挨拶、同僚!



約1か月前、私はここでGUIフレームワークに関する記事を公開しました-スレッドに 、さまざまなプログラミング言語用のGUIフレームワークを作成するための技術を提供しました。 ここでは、このアイデアの具体的な実装( Golangの新しいGUIフレームワーク)を紹介します。



既に多くのツールが利用可能な場合、 Golangの新しいGUIを作成する必要があったのはなぜですか? まず第一に、それらのどれも私に最もふさわしくなかったからです。 クロスプラットフォームのデスクトップアプリケーションを作成するには、プラットフォームごとに自然に見えるものが必要でした。 可能であれば、非常に大きくなく、最小限の依存関係で-私は最小限のアプローチに取り組んでいます。



私はこのリストに導かれました 。 2つのポジション- アプリウォークは、クロスプラットフォームの要件を満たしていないため、すぐに取り消されました。 少し考えた後、彼はhtml / css / javascriptに基づくものを拒否しました。 第一に、デスクトップアプリケーションをWebページとして構築することはやや珍しいように思われ、第二に、非常に重いエンジンを使用します。 したがって、たとえば、 go-astilectrongowdはそれぞれElectronnw.jsに基づいており、これらはnode.jsに基づいています。 小さなユーティリティを実行するために、エンドユーザーがすべてをインストールする必要があることを想像してみてください。 go-sctiterがこの観点から好ましいと思われない限り:背後にいるSciterはそれほど怪物ではありません。



Go-gtkgotk3はGTKに基づいています。 どうやら、これらは徹底的に作られたパッケージですが、WindowsでGTKを使用するのが最善の解決策ではないため、私もそれらを拒否しました。 GTKウィンドウは、Windowsではネイティブに見えません。 もちろん、 Qtバインディングは強力なものですが、かなり複雑で、寸法も...私が読んだとき:「2.5 GBの空きRAM(初期セットアップ時にのみ必要)と少なくとも5 GBの空きディスク容量が必要です」と最後の疑問は消えました。 Go自体が占有するスペースは10分の1です。 そして、ライセンス制限があります:「LGPLライセンスとのこのバインディングは、一般大衆に配布することを目的としたクローズドソースアプリケーションでの使用には適していません」。



リストから何を残しましたか? Uiは良い選択肢かもしれませんが、まだ中間アルファ段階にあります。 Fyneもかなり良いように見えますが、完全に準備ができていないようです。 一方で、「Fyneは完全にベクターグラフィックスを使用して構築されている」こと、そして「EFLウィンドウパッケージは現在はるかに古いため、Fyneアプリケーションのベクターグラフィックス部分が表示されない」ことは少し恥ずかしかったです。 まあ、Windows( Fyneがベースにしているグラフィックライブラリ)にEFLをインストールするためには、 MSYSが必要です。



要するに、これらのパッケージの作者と彼らの労働の産物に敬意を払って、私は自分のために何も選択せず、明確な良心をもって、私がやりたいことに進みました-新しいGUIフレームワークを書く- 外部



前の記事ですでに書いたように、 ExternalはGUI要素を独自に実装せず、このために別個のアプリケーション、GUIサーバーとして機能する別個のプロセスを使用します。このアプリケーションはGuiServerと呼ばれます外部はそれを起動し、tcp / ipを介して結合し、ウィンドウとウィジェットの作成、それらの操作などのためのコマンド/リクエストを送信し、そこからメッセージを受信します。



伝統的な碑文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() }
      
      





Init()関数はGuiServerを起動し、 それに参加します。 文字列パラメータをそれに渡すことができ、必要に応じて、 GuiServerの名前とそのパス、IPアドレスとポート、ログレベルを決定します。



InitMainWindow()は、指定されたパラメーターでメインアプリケーションウィンドウを作成します。 メソッドAddWidget()-タイプラベルのウィジェットを追加します。



Activate()-画面にウィンドウを表示し、プログラムをスタンバイモードにします。

ウィンドウとウィジェットの両方がウィジェット構造で定義されています-オブジェクトごとに個別の構造を作成しませんでした。 Goには継承がないため、これを実装する便利な方法は見つかりませんでした。 この構造には、ほとんどのウィジェットに共通のフィールドと、特定のオブジェクトに固有のプロパティを含むマップ[文字列]文字列が含まれます。



 type Widget struct { Parent *Widget Type string Name string X int [...] Font *Font AProps map[string]string aWidgets []*Widget }
      
      





この構造のメソッドには、おなじみのAddWidget()、SetText()、SetImage()、SetParam()、SetColor()、SetFont()、GetText()、Move()、Enable()などが含まれます。イベントハンドラーを設定するためのSetCallBackProc()およびSetCallBackFunc()に言及したいと思います。

ここにすべての関数、構造、およびメソッドをリストすることは不適切です。これは、より正確にあるためです。 ドキュメントが必要です。 私はいくつかの一般的なアイデアを与えるためにいくつかだけを言います:



Menu()、MenuContext()、EndMenu()、AddMenuItem()、AddMenuSeparator()-メニュー、メインまたはコンテキストメニューを作成するための一連の関数。

EvalProc(sCode文字列)、EvalFunc(sCode文字列)は、組み込みのスクリプト言語の一種であるGuiServerで実行するために、ハーバーコードフラグメント(複数行も可)を渡します。

OpenForm(sPath文字列)-HwGui Designerによって作成されたxmlファイルの説明に基づいてウィンドウを作成します。

OpenReport(sPath文字列)-HwGui Designerによって作成されたxmlファイルの説明に基づいてレポートを印刷します。

MsgInfo()、...、SelectFile()、SelectColor()、SelectFont()-標準のメッセージボックスとダイアログを呼び出します。

InitPrinter()および一連のプリンター構造メソッド:Say()、Box()、Line()などは、プリンターにプレビュー機能を提供します。



現在サポートされているウィジェットの完全なリストは次のとおりです。

ラベル、編集、ボタン、チェック、ラジオ、radiogr、グループ、コンボ、ビットマップ、ライン、パネル(他のウィジェットをホストするように設計されています)、paneltop、panelbot、ownbtn(所有者描画ボタン)、スプリッター、アップダウン、ツリー、進行状況、タブ、ブラウズ(テーブル、多くの人が呼ぶ)、cedit(高度な機能を備えた編集)、monthcal。



それらはすべて、追加のプロパティとともにextwidg.goのinit()関数にリストされています。 それぞれにアクセス可能-これらのプロパティはWidget.APropsを介して設定されます。 これらのウィジェットの多くには、他のプロパティがあります。特に、豊富なブラウザがあります。 SetParam()メソッドを使用して個別に設定できます。



外部はボリュームが小さく、純粋なGoで書かれており、いくつかの標準パッケージを除いて他のパッケージをプルしません。 クロスプラットフォームはGuiServerにより提供され、Windows、Linux / Unix、Mac OSでコンパイルできます。 特定の不便さは、この外部モジュールを使用する必要性と正確に関連しています。この外部モジュールは、ソースからコンパイルするか、完成したモジュールをサイトからダウンロードしてPATHで指定されたディレクトリに配置する必要があります。 ちなみに、Windowsの場合は約1.5メガバイト、Linuxの場合は約3メガバイトです。



どのように見えるか、小さなアプリケーションETutor -Golangチュートリアルの例を示します。 このプログラムは、Goのコードフラグメントのコレクションをツリー形式で表示します。 コードを編集して実行することができます。 特別なことはありませんが、非常に快適です。 コレクションを補充し、新しいコレクションを追加できます。 現在、(まだ完全ではありませんが)A Tour of Go、Go by Example、 Externalのいくつかの例が収集されています。 ETutorは、たとえばGoでユーティリティセットを整理するために使用できます。 それで、スクリーンショット。



Windows 10:







Debian、Gnome:







そして最後に、リンク:



Githubの外部

GithubのGuiServer

GithubのETutor

既製のバイナリをダウンロードできる私のウェブサイトのGuiServerに関するページ

https://groups.google.com/d/forum/guiserver-GuiServerおよび外部に関連するすべての問題を議論するグループ

HabréのGuiServerに関する記事



All Articles