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