質問: ### 前提・実現したいこと GolangでGUIを作成しています。 その中で情報取得中であることを示すウインドウを作成しようと思っています。 ### 試したこと 以下の内容でMainWindowの作成をしました。 ``` import ( "time" "github.com/lxn/walk" . "github.com/lxn/walk/declarative" ) // 受け渡し用構造体 type MyLoadWindow struct { *walk.MainWindow progressBar *walk.ProgressBar } // 読み込み画面 func Main() { mw := &MyLoadWindow{} // 画面サイズ取得 sizeX := 300 sizeY := 100 // 画面情報設定 MW := MainWindow{ AssignTo: &mw.MainWindow, Title: "待機中", Size: Size{ sizeX, sizeY}, Font: Font{PointSize: 12}, Layout: VBox{}, Children: []Widget{ ProgressBar{ AssignTo: &mw.progressBar, MarqueeMode: true, }, }, } MW.Create() time.Sleep(3 * time.Second) mw.MainWindow.Close() } ``` ### 発生している問題・エラーメッセージ 上記のコードを実行したときに、ウインドウ自体は表示されるのですがプログレスバーが表示されません。 試しにMW.Create()を ``` MW.Run() ``` に変更したところプログレスバーが表示されました。 しかし、そのあとのコードにもある通り3秒後にウインドウを閉じるという処理を行いたいため Run()は使用したくないです。 (Run()で呼び出すとGUI上で×ボタンを押して終了しないとtime.Sleep(3 * time.Second)の行にステップしないため) どうすればCreate()でChildrenに設定したプログレスバーを表示できるでしょうか? また、Create()とRun()の違いを理解できていないのでどのような違いがあるのかわかる方がいましたら教えていただきたいです。 ### 補足情報(FW/ツールのバージョンなど) Golang Windows
回答: MW.Run()は内部でFormBase.Run()を呼びます。 GUI全般に言えるのですが、 GUIが順当に動くためには「イベントを繰り返しハンドリングする処理」がどこかに必要です。 その処理をしているのがFormBase.Run()です。 この処理が動いていない限り、Windowの表示も移動も閉じる操作も空振りです。 いくらWindowをCreateしてもそのWindowを表示する際のイベントを だれもハンドリングしてくれないから。 Createの用途は複数同じデザインのウインドウを表示するときぐらいです。 つまり、Runを使わずに動かすのは無理です。