ユーザーが操作できる GUI パーツのことをコントロールと言います。そしてコントロールは、ユーザーの操作を受けて、イベントというものを発します。このイベントと、何かの処理を結びつけることによって、アプリケーションは動作するようになります。
wxWidgets では、GUI パーツのことをウィジェット(widgets)と呼んでいます。
package main
import "github.com/dontpanic92/wxGo/wx"
func main() {
app := wx.NewApp()
frame := wx.NewFrame(wx.NullWindow, -1, "Check Box")
vBox := wx.NewBoxSizer(wx.VERTICAL)
frame . SetSizer(vBox)
check := wx.NewCheckBox(frame, -1, "Show title")
check . SetValue(true)
vBox . Add(check, 1, wx.ALIGN_CENTER)
wx.Bind(check, wx.EVT_CHECKBOX, func(e wx.Event) {
if check.GetValue() {
frame.SetTitle("Check Box")
} else {
frame.SetTitle("")
}
}, check.GetId())
frame . Show()
app . MainLoop()
}
ターミナルで、checkbox.go を保存したディレクトリに移動して、次のコードを実行してください。
go run checkbox.go
実行結果が表示されるまで、少し時間がかかります。
チェックボックスがチェックされていれば、フレームのタイトルは表示されます。チェックボックスがチェックされていなければ、フレームのタイトルは表示されません。
check := wx.NewCheckBox(frame, -1, "Show title")
チェックボックスを作っています。
引数を順番に説明すると次のようになります。
check . SetValue(true)
このようにすると、チェックボックスにチェックが入ります。
vBox . Add(check, 1, wx.ALIGN_CENTER)
このようにすると、vBox の中央にチェックボックスが表示されます。レイアウトするボックスが wx.HORIZONTAL の場合は、中央には表示されません。
wx.Bind(check, wx.EVT_CHECKBOX, func(e wx.Event) {...}, check.GetId())
wx.Bind メソッドで、コントロールがユーザーによって操作された時に発生するイベントと、処理を結びつけています。
引数を順番に説明すると次のようになります。
if check.GetValue() {
frame.SetTitle("Check Box")
} else {
frame.SetTitle("")
}
check.GetValue( ) で、チェックボックスがチェックされいれば true が、チェックされていなければ false が返ってきます。
frame.SetTitle(...) で、フレームのタイトルが設定されます。
package main
import (
"github.com/dontpanic92/wxGo/wx"
"strconv"
)
func main() {
app := wx.NewApp()
frame := wx.NewFrame(wx.NullWindow, -1, "Slider")
vBox := wx.NewBoxSizer(wx.VERTICAL)
hBox := wx.NewBoxSizer(wx.HORIZONTAL)
frame . SetSizer(hBox)
label := wx.NewStaticText(frame, -1, "50")
slider := wx.NewSlider(frame, -1, 50, 0, 100)
vBox . Add(label, 0, wx.ALIGN_CENTER)
vBox . Add(slider, 0, wx.ALL|wx.EXPAND, 10)
hBox . Add(vBox, 1, wx.ALIGN_CENTER)
wx.Bind(slider, wx.EVT_SLIDER, func(e wx.Event) {
label.SetLabel(strconv.Itoa(slider.GetValue()))
}, slider.GetId())
frame . Show()
app . MainLoop()
}
ターミナルで、slider.go を保存したディレクトリに移動して、次のコードで実行してください。
go run slider.go
実行結果が表示されるまで、少し時間がかかります。
スライダーを動かすと、その値がラベル(StaticText)に表示されます。
StaticText に表示される文字列は、ユーザーが変更することはできません。しかしプログラム内部からは変更することができます。
"strconv"
strconv.Itoa メソッドを使うために読み込んでいます。
vBox := wx.NewBoxSizer(wx.VERTICAL)
hBox := wx.NewBoxSizer(wx.HORIZONTAL)
vBox が ラベルとスライダーを配置するボックスです。そしてその vBox を丸ごと hBox に入れて、フレーム中央に表示するようにします。
label := wx.NewStaticText(frame, -1, "50")
ウィンドウなどに表示される編集できない文字列は、StaticText で作ります。
slider := wx.NewSlider(frame, -1, 50, 0, 100)
スライダーを作っています。
引数を順番に説明すると次のようになります。
vBox . Add(label, 0, wx.ALIGN_CENTER)
vBox . Add(slider, 0, wx.ALL|wx.EXPAND, 10)
hBox . Add(vBox, 1, wx.ALIGN_CENTER)
ラベルとスライダーを、なんとかフレームの中央に表示したくて、いろいろと試してみた結果です。
wx.Bind(slider, wx.EVT_SLIDER, func(e wx.Event) {
スライダーが動かさせれた時のイベントは、wx.EVT_SLIDER です。
label.SetLabel(strconv.Itoa(slider.GetValue()))
ラベルの文字列を書き換えるには、SetLabel(文字列)を使います。
スライダー.GetValue( )で、スライダーの値が数値として取得できます。
strconv.Itoa(数値)で、数値を文字列に変換します。
package main
import "github.com/dontpanic92/wxGo/wx"
func main() {
app := wx.NewApp()
frame := wx.NewFrame(wx.NullWindow, -1, "Radio Box")
vBox := wx.NewBoxSizer(wx.VERTICAL)
frame . SetSizer(vBox)
slice := [] string {"Red", "Green", "Blue"}
rBox := wx.NewRadioBox(frame, -1, "Red", wx.DefaultPosition, wx.DefaultSize, slice, wx.RA_HORIZONTAL)
vBox . Add(rBox, 1, wx.ALL|wx.EXPAND, 20)
wx.Bind(rBox, wx.EVT_RADIOBOX, func(e wx.Event) {
rBox.SetLabel(rBox.GetStringSelection())
}, rBox.GetId())
frame . Show()
app . MainLoop()
}
ターミナルで、radiobox.go を保存したディレクトリに移動して、次のコードで実行してください。
go run radio.go
実行結果が表示されるまで、少し時間がかかります。
ラジオボタンをクリックすると、そのラベルが、ラジオボックスのラベルになります。
array := [] string {"Red", "Green", "Blue"}
レジオボタンに表示されるラベルのスライスを作ります
rBox := wx.NewRadioBox(frame, -1, "Red", wx.DefaultPosition, wx.DefaultSize, slice, wx.RA_HORIZONTAL)
ラジオボックスを作っています。
引数を順番に説明すると次のようになります。
wx.Bind(rBox, wx.EVT_RADIOBOX, func(e wx.Event) {
ラジオボックスのラジオボタンがクリックされた時のイベントは、wx.EVT_RADIOBOXです。
rBox.SetLabel(rBox.GetStringSelection())
ラジオボックスの SetLabel(文字列) メソッドで、ラジオボックスのラベルの文字列を書き換えます。
ラジオボックスの GetStringSelection( ) メソッドで、クリックされたラジオボタンのラベルの文字列を取得できます。
package main
import "github.com/dontpanic92/wxGo/wx"
func main() {
app := wx.NewApp()
frame := wx.NewFrame(wx.NullWindow, -1, "Choice")
hBox := wx.NewBoxSizer(wx.HORIZONTAL)
vBox := wx.NewBoxSizer(wx.VERTICAL)
frame . SetSizer(vBox)
slice := [] string {"Windows", "macOS", "Linux Mint"}
choice := wx.NewChoice(frame, -1, wx.DefaultPosition, wx.DefaultSize, slice)
label := wx.NewStaticText(frame, -1, "Windows")
hBox . Add(label, 0, wx.ALIGN_CENTER)
vBox . Add(choice, 0, wx.LEFT|wx.TOP|wx.RIGHT|wx.EXPAND, 20)
vBox . Add(hBox, 1, wx.ALIGN_CENTER)
wx.Bind(choice, wx.EVT_CHOICE, func(e wx.Event) {
label.SetLabel(choice.GetStringSelection())
}, choice.GetId())
frame . Show()
app . MainLoop()
}
ターミナルで、choice.go を保存したディレクトリに移動して、次のコードで実行してください。
go run choice.go
実行結果が表示されるまで、少し時間がかかります。
チョイスで項目を選択すると、選択された項目の文字列がラベルに表示されます。
choice := wx.NewChoice(frame, -1, wx.DefaultPosition, wx.DefaultSize, slice)
チョイスを作っています。
引数を順番に説明すると次のようになります。
wx.Bind(choice, wx.EVT_CHOICE, func(e wx.Event) {
チョイスで項目が選択された時のイベントは、wx.EVT_CHOICE です。
チョイスと似たものにコンボボックスがあります。チョイスとの違いは、コントロールに、選択項目以外の初期値、例えば「お選びください」などの文字列を表示できることです。
package main
import "github.com/dontpanic92/wxGo/wx"
func main() {
app := wx.NewApp()
frame := wx.NewFrame(wx.NullWindow, -1, "Combo Box")
panel := wx.NewPanel(frame, -1)
hBox := wx.NewBoxSizer(wx.HORIZONTAL)
vBox := wx.NewBoxSizer(wx.VERTICAL)
panel . SetSizer(vBox)
slice := [] string {"Windows", "macOS", "Linux Mint"}
combobox:= wx.NewComboBox(panel, -1, "お選びください", wx.DefaultPosition, wx.DefaultSize, slice, wx.CB_SIMPLE)
label := wx.NewStaticText(panel, -1, "未選択")
hBox . Add(label, 0, wx.ALIGN_CENTER)
vBox . Add(combobox, 0, wx.LEFT|wx.TOP|wx.RIGHT|wx.EXPAND, 20)
vBox . Add(hBox, 1, wx.ALIGN_CENTER)
wx.Bind(combobox, wx.EVT_COMBOBOX, func(e wx.Event) {
label.SetLabel(combobox.GetStringSelection())
}, combobox.GetId())
frame . Show()
app . MainLoop()
}
コンボボックスのコード説明は、省略させていただきます。
package main
import "github.com/dontpanic92/wxGo/wx"
func main() {
app := wx.NewApp()
frame := wx.NewFrame(wx.NullWindow, -1, "List Box")
panel := wx.NewPanel(frame, -1)
hBox := wx.NewBoxSizer(wx.HORIZONTAL)
vBox := wx.NewBoxSizer(wx.VERTICAL)
panel . SetSizer(vBox)
slice := [] string {"Windows", "macOS", "Linux Mint"}
listbox:= wx.NewListBox(panel, -1, wx.DefaultPosition, wx.DefaultSize, slice, wx.LB_SINGLE)
label := wx.NewStaticText(panel, -1, "未選択")
hBox . Add(label, 0, wx.BOTTOM, 20)
vBox . Add(listbox, 1, wx.ALL|wx.EXPAND, 20)
vBox . Add(hBox, 0, wx.ALIGN_CENTER)
wx.Bind(listbox, wx.EVT_LISTBOX, func(e wx.Event) {
label.SetLabel(listbox.GetStringSelection())
}, listbox.GetId())
frame . Show()
app . MainLoop()
}
package main
import "github.com/dontpanic92/wxGo/wx"
func main() {
app := wx.NewApp()
frame := wx.NewFrame(wx.NullWindow, -1, "Tree Control")
panel := wx.NewPanel(frame, -1)
hBox := wx.NewBoxSizer(wx.HORIZONTAL)
vBox := wx.NewBoxSizer(wx.VERTICAL)
panel . SetSizer(vBox)
treectrl:= wx.NewTreeCtrl(panel, -1, wx.DefaultPosition, wx.DefaultSize)
label := wx.NewStaticText(panel, -1, "未選択")
hBox . Add(label, 0, wx.BOTTOM, 10)
vBox . Add(treectrl, 1, wx.ALL|wx.EXPAND, 10)
vBox . Add(hBox, 0, wx.ALIGN_CENTER)
root := treectrl.AddRoot("Programming languages")
script := treectrl.AppendItem(root, "Scripting languages")
treectrl.AppendItem(script, "Python")
treectrl.AppendItem(script, "Ruby")
treectrl.AppendItem(script, "PHP")
compile := treectrl.AppendItem(root, "Compiled languages")
treectrl.AppendItem(compile, "Haskell")
treectrl.AppendItem(compile, "C++")
treectrl.AppendItem(compile, "Go")
wx.Bind(treectrl, wx.EVT_TREE_SEL_CHANGED, func(e wx.Event) {
label.SetLabel(treectrl.GetItemText(treectrl.GetSelection()))
}, treectrl.GetId())
frame . Show()
app . MainLoop()
}