hakeの日記

Windows環境でプログラミングの勉強をしています。

Go言語 - WALKでGUI - RadioButton

RadioButtonの使用例。

起動時にRadioButtonを選択してある状態にする方法がわからない。。。
RadioButtunをRadioButtonGroupBoxの中に配置することで、そのグループ内で排他選択ができるようになります。各RadioButtonウィジェットから、そのボタンが選択されているかの情報が取得できない様なので、MyMainWindow構造体の中にフィールドを追加して、RadioButtonのクリックイベントでフィールドの値にRadioButtonのValuefフィールドの値を設定する様にしています。このときValue()メソッドで返されるのがinterface{}型の為、型アサーションでint型に変換して代入しました。

package main

import (
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
)

import (
	"fmt"
	"os"
)

type MyMainWindow struct {
	*walk.MainWindow
//	rdgb1  *walk.GroupBox
//	rdgb2  *walk.GroupBox
	rd1   *walk.RadioButton
	rd2   *walk.RadioButton
	edit   *walk.TextEdit

	// ウィジェットから直接チェック有無を確認できない為
	// クリックイベントでこの変数に保持する。
	rdG1Value int  // Group1用
}

func main() {
	mw := &MyMainWindow {}
	mw.rdG1Value = 0

	MW := MainWindow{
		AssignTo: &mw.MainWindow,
		Title: "RadioButtonテスト",
		MinSize: Size {300, 200},
		Size   : Size {300, 300},
		Layout: VBox {},
		Children: []Widget {
			RadioButtonGroupBox {
//				AssignTo: &mw.rdgb1,
				Title: "Group 1",
				Layout: HBox{},
				Buttons: []RadioButton {
					RadioButton {
						AssignTo: &mw.rd1,
						Text: "Btn 1",
						Value: 1,
						OnClicked: mw.rb1Clicked,
					},
					RadioButton {
						AssignTo: &mw.rd2,
						Text: "Btn 2",
						Value: 2,
						OnClicked: mw.rb2Clicked,
					},
				},
			},

			RadioButtonGroupBox {
//				AssignTo: &mw.rdgb2,
				Title: "Group 2",
				Layout: HBox{},
				Buttons: []RadioButton {
					RadioButton {
//						AssignTo: &mw.rd3,
						Text: "Btn 3",
						Value: "3",
					},
					RadioButton {
//						AssignTo: &mw.rd4,
						Text: "Btn 4",
						Value: "4",
					},
				},
			},


			TextEdit {
				AssignTo: &mw.edit,
			},
			PushButton {
				Text: "Push",
				OnClicked: mw.pbClicked,
			},
		},
	}

	if _, err := MW.Run(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}

}

func (mw *MyMainWindow) rb1Clicked() {
	mw.edit.AppendText("Event : Btn1 Clicked\r\n")
	i := mw.rd1.Value()
	mw.rdG1Value = i.(int)  // 型アサーション

}
func (mw *MyMainWindow) rb2Clicked() {
	mw.edit.AppendText("Event : Btn2 Clicked\r\n")
	i := mw.rd2.Value()
	mw.rdG1Value = i.(int)  // 型アサーション
}

func (mw *MyMainWindow) pbClicked() {
	var s string
	if mw.rdG1Value == 0 {
		s = fmt.Sprintf("INFO : Button is not selected\r\n")
	} else {
		s = fmt.Sprintf("INFO : Button %d is selected\r\n", mw.rdG1Value)
	}
	mw.edit.AppendText(s)
}