グラフィカルなメモ帳に移動

Go言語は1年以上存在しているという事実にもかかわらず、この言語のグラフィカルインターフェイスを使用してアプリケーションを作成する方法に関する情報は実質的にありません。 おそらくこれは、公式ライブラリの中にGUIを操作するためのライブラリがまだないという事実によるものです。 ただし、これは、ユーザーインターフェイスを備えたアプリケーションを作成できないことを意味するものではありません。そのような機会を提供するライブラリがあります。 彼らのリストをあげよう。 しかし、このリストにリストされていないライブラリがいくつかあります。 その中にはWalkがあり 、その名前は「Windows Application Library Kit」を表しています。 それを使用して、ユーザーインターフェイスを備えた小さなアプリケーションを作成しようとします。

問題の声明

入力したテキストをファイルに保存し、そのテキストを読み込んで、テキストをクリップボードにコピーしてそこから抽出できる小さなメモ帳を作成するとします。

Walk Libraryをインストールする

Walkは、Goバージョン1.1.x以降でのみ機能します。 最初のステップは、GitHubからライブラリをダウンロードしてインストールすることです。 CMDを実行して、コマンドを実行します。
go get github.com/lxn/walk 

Goが次のような誓いを立て、生成する場合
 go: missing Git command ... 
git-scm.com/downloadsにアクセスしてGitをインストールする必要があります。 インストール後にエラーが消えなかった場合は、Gitへのパスが%PATH%で指定されていることを確認する必要があります。

空のフォームを作成する

次の内容でgopad.goソースファイルを作成します。
 package main import ( . "github.com/lxn/walk/declarative" ) func main() { MainWindow{ Title: "GoPad", //    MinSize: Size{600, 400}, //     }.Run() } 

次にソースをコンパイルします。 次の内容でbuild.bat batスクリプトを作成します。
 go build -ldflags="-H windowsgui" pause 

ldflagsキーを登録できませんでしたが、フォームはバックグラウンドでコンソールとともに実行されます。 スクリプトを実行し、すべてが正しくコンパイルされたことを確認します。 ただし、結果の.exeファイルを実行するには早すぎます。 マニフェストという別のファイルを作成する必要があります。 次の内容のファイルgopad.exe.manifest作成します( gopad.exe.manifest代わりに、結果のバイナリの名前gopad.exe必要です)。
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeName" type="win32"/> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> </dependentAssembly> </dependency> </assembly> 

マニフェストが存在する必要があります。 それなしでは、バイナリは起動しません!
完了したら、空のフォームを実行して、すべてが機能することを確認します。 結果のプログラムは次のようになります。


必要なボタンと入力フィールドを追加します

まず、入力フィールドを追加します。 インポートする別のライブラリを追加します。
 import ( "github.com/lxn/walk" . "github.com/lxn/walk/declarative" ) 

次に、入力フィールドとポインター変数を作成し、フィールドにバインドします。
 func main() { var edit *walk.TextEdit MainWindow{ Title: "GoPad", MinSize: Size{600, 400}, Layout: VBox{}, Children: []Widget{ TextEdit{AssignTo: &edit}, }, }.Run() } 

実行して、フォーム全体に表示される入力フィールドが表示されることを確認します。
同様に、メインウィンドウに「コピー」、「貼り付け」、「ロード」、「保存」の4つのボタンを作成します。
 MainWindow{ Title: "GoPad", MinSize: Size{600, 400}, Layout: VBox{}, Children: []Widget{ TextEdit{AssignTo: &edit}, HSplitter{ MinSize: Size{600, 30}, Children: []Widget{ PushButton{ Text: "Copy", }, PushButton{ Text: "Paste", }, PushButton{ Text: "Load", }, PushButton{ Text: "Save", }, }, }, }, }.Run() 

その結果、次のフォームが得られます。

すべての要素が配置されたら、少し機能を追加します。

バッファーを操作する

ボタンクリックハンドラーを追加するには、ボタン自体のプロパティでボタンが押されたときに起動される必要な機能を登録するだけで十分です。
 PushButton{ Text: "Save", OnClicked: func() { // ... }, }, 

無名関数を作成するか、既存の関数を登録できます。

Walkを使用すると、次の機能を使用してクリップボードを直接操作できます。
 walk.Clipboard().SetText("text"); //      walk.Clipboard().Text(); //   

入力フィールドのテキストを取得または置換するには、次の関数を使用します。
 edit.Text(); //      edit.SetText("text"); //      

これで、ボタンの内容は次のようになります。
 PushButton{ Text: "Copy", OnClicked: func() { walk.Clipboard().SetText(edit.Text()); }, }, PushButton{ Text: "Paste", OnClicked: func() { if text, err := walk.Clipboard().Text(); err == nil { edit.SetText(text) } }, }, 


ファイルに保存してそこからロードする

ロードとファイルへの保存を別々の関数に入れましょう。 これを行うには、 edit変数をグローバルにします。 テキストファイルfile.txtからテキストをフィールドにロードするreadFromFile関数を作成しましょう( "io/ioutil"を追加してimportする必要があることを忘れないでください)。
 var edit *walk.TextEdit func readFromFile() { contents,_ := ioutil.ReadFile("file.txt") edit.SetText(string(contents)) } 

同様に、保存をファイルに書き込みます。
 func saveToFile() { ioutil.WriteFile("file.txt", []byte(edit.Text()), 0x777) } 

次に、対応するボタンに関数をバインドする必要があります。
 PushButton{ Text: "Load", OnClicked: readFromFile, }, PushButton{ Text: "Save", OnClicked: saveToFile, }, 

PSプログラムは、Unicodeでテキストファイルの内容を読み書きします。

まとめ

Walkライブラリを使用して、Goでグラフィカルインターフェイスを備えた小さなノートブックを作成しました。 必要に応じて、ファイル選択、コンテキストメニューの追加、タブとフォントの操作など、機能を拡張できます。 Walkは積極的に開発を進めており、多数のWinUIコンポーネントへのアクセスを提供しています。 ライブラリを使用した多くの例があります。

ファイルのソースコード:

gopad.go
 package main import ( "github.com/lxn/walk" . "github.com/lxn/walk/declarative" "io/ioutil" ) var edit *walk.TextEdit func readFromFile() { contents,_ := ioutil.ReadFile("file.txt") edit.SetText(string(contents)) } func saveToFile() { ioutil.WriteFile("file.txt", []byte(edit.Text()), 0x777) } func main() { MainWindow{ Title: "GoPad", MinSize: Size{600, 400}, Layout: VBox{}, Children: []Widget{ TextEdit{AssignTo: &edit}, HSplitter{ MaxSize: Size{600, 30}, Children: []Widget{ PushButton{ Text: "Copy", OnClicked: func() { walk.Clipboard().SetText(edit.Text()); }, }, PushButton{ Text: "Paste", OnClicked: func() { if text, err := walk.Clipboard().Text(); err == nil { edit.SetText(text) } }, }, PushButton{ Text: "Load", OnClicked: readFromFile, }, PushButton{ Text: "Save", OnClicked: saveToFile, }, }, }, }, }.Run() } 

gopad.exe.manifest
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> </dependentAssembly> </dependency> </assembly> 

build.bat
 go build -ldflags="-H windowsgui" pause 


参照資料

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


All Articles