ユーザーが操作できる ウィジェットのことをコントロールと言います。そしてコントロールは、ユーザーの操作を受けて、イベントというものを発します。このイベントと、何かの処理を接続することによって、アプリケーションは動作するようになります。
GTK では、GUI パーツのことをウィジェット(widget)と呼んでいます。
package main
import (
"github.com/mattn/go-gtk/gtk"
"os"
)
func main() {
gtk . Init(&os.Args)
window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)
window . SetTitle("Button")
window . SetPosition(gtk.WIN_POS_CENTER)
window . Connect("destroy", gtk.MainQuit)
button := gtk.NewButtonWithLabel("Exit")
button . SetSizeRequest(80, 28)
button . Connect("clicked", gtk.MainQuit)
align := gtk.NewAlignment(0.5, 0.5, 0, 0)
align . Add(button)
window . Add(align)
window . ShowAll()
window . SetSizeRequest(400, 250)
gtk . Main()
}
ターミナルで、button.go を保存したディレクトリに移動して、次のコードを実行してください。
go run button.go
package main
import (
"github.com/mattn/go-gtk/gtk"
"os"
)
func main() {
gtk . Init(&os.Args)
window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)
window . SetTitle("Check Button")
window . SetPosition(gtk.WIN_POS_CENTER)
window . Connect("destroy", gtk.MainQuit)
check := gtk.NewCheckButtonWithLabel("Show Title")
check . SetActive(true)
check . Connect("clicked", func() {
if check.GetActive() {
window.SetTitle("Check Button")
} else {
window.SetTitle("")
}
})
align := gtk.NewAlignment(0.5, 0.5, 0, 0)
align . Add(check)
window . Add(align)
window . ShowAll()
window . SetSizeRequest(400, 250)
gtk . Main()
}
ターミナルで、checkbutton.go を保存したディレクトリに移動して、次のコードを実行してください。
go run checkbutton.go
package main
import (
"github.com/mattn/go-gtk/gtk"
"os"
)
func main() {
gtk . Init(&os.Args)
window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)
window . SetTitle("Radio Button")
window . SetPosition(gtk.WIN_POS_CENTER)
window . Connect("destroy", gtk.MainQuit)
label := gtk.NewLabel("")
label . SetMarkup("<span foreground='red' size='19000'>Hello Go-GTK</span>")
hsep := gtk.NewHSeparator()
red := gtk.NewRadioButtonWithLabel(nil, "Red")
green := gtk.NewRadioButtonWithLabel(red.GetGroup(), "Green")
blue := gtk.NewRadioButtonWithLabel(red.GetGroup(), "Blue")
red . Connect("clicked", func() {
if red.GetActive() {
label.SetMarkup("<span foreground='red' size='19000'>Hello Go-GTK</span>")
}
})
green . Connect("clicked", func() {
if green.GetActive() {
label.SetMarkup("<span foreground='green' size='19000'>Hello Go-GTK</span>")
}
})
blue . Connect("clicked", func() {
if blue.GetActive() {
label.SetMarkup("<span foreground='blue' size='19000'>Hello Go-GTK</span>")
}
})
hbox := gtk.NewHBox(false, 10)
hbox . Add(red)
hbox . Add(green)
hbox . Add(blue)
vbox := gtk.NewVBox(true, 0)
vbox . Add(label)
vbox . Add(hsep)
vbox . Add(hbox)
align := gtk.NewAlignment(0.5, 0.5, 0, 0)
align . Add(vbox)
window . Add(align)
window . ShowAll()
window . SetSizeRequest(400, 250)
gtk . Main()
}
ターミナルで、radiobutton.go を保存したディレクトリに移動して、次のコードを実行してください。
go run radiobutton.go
package main
import (
"github.com/mattn/go-gtk/gdk"
"github.com/mattn/go-gtk/gtk"
"os"
)
func main() {
gtk . Init(&os.Args)
window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)
window . SetTitle("Radio Button")
window . SetPosition(gtk.WIN_POS_CENTER)
window . Connect("destroy", gtk.MainQuit)
var gdkwin *gdk.Window
var pixmap *gdk.Pixmap
var gc *gdk.GC
r := uint16(0)
g := uint16(0)
b := uint16(0)
red := gtk.NewToggleButtonWithLabel("Red")
green := gtk.NewToggleButtonWithLabel("Green")
blue := gtk.NewToggleButtonWithLabel("Blue")
red . SetSizeRequest(100, 28)
green . SetSizeRequest(100, 28)
blue . SetSizeRequest(100, 28)
red . Connect("clicked", func() {
if red.GetActive() {
r = 65535
} else {
r = 0
}
gc . SetRgbFgColor(gdk.NewColorRGB(r, g, b))
pixmap . GetDrawable().DrawRectangle(gc, true, 0, 0, -1, -1)
gdkwin.GetDrawable().DrawDrawable(gc, pixmap.GetDrawable(), 0, 0, 0, 0, -1, -1)
})
green . Connect("clicked", func() {
if green.GetActive() {
g = 65535
} else {
g = 0
}
gc . SetRgbFgColor(gdk.NewColorRGB(r, g, b))
pixmap . GetDrawable().DrawRectangle(gc, true, 0, 0, -1, -1)
gdkwin.GetDrawable().DrawDrawable(gc, pixmap.GetDrawable(), 0, 0, 0, 0, -1, -1)
})
blue . Connect("clicked", func() {
if blue.GetActive() {
b = 65535
} else {
b = 0
}
gc . SetRgbFgColor(gdk.NewColorRGB(r, g, b))
pixmap . GetDrawable().DrawRectangle(gc, true, 0, 0, -1, -1)
gdkwin.GetDrawable().DrawDrawable(gc, pixmap.GetDrawable(), 0, 0, 0, 0, -1, -1)
})
drawing := gtk.NewDrawingArea()
drawing . Connect("configure-event", func() {
alloc := drawing.GetAllocation()
pixmap = gdk.NewPixmap(drawing.GetWindow().GetDrawable(), alloc.Width, alloc.Height, 24)
gc = gdk.NewGC(pixmap.GetDrawable())
gc . SetRgbFgColor(gdk.NewColorRGB(r, g, b))
pixmap . GetDrawable().DrawRectangle(gc, true, 0, 0, -1, -1)
})
drawing . Connect("expose-event", func() {
gdkwin.GetDrawable().DrawDrawable(gc, pixmap.GetDrawable(), 0, 0, 0, 0, -1, -1)
})
vbox := gtk.NewVBox(false, 10)
vbox . Add(red)
vbox . Add(green)
vbox . Add(blue)
hbox := gtk.NewHBox(true, 20)
hbox . Add(vbox)
hbox . Add(drawing)
align := gtk.NewAlignment(0.5, 0.5, 0, 0)
align . Add(hbox)
window . Add(align)
window . ShowAll()
window . SetSizeRequest(400, 250)
gdkwin = drawing.GetWindow()
gtk . Main()
}
ターミナルで、togglebutton.go を保存したディレクトリに移動して、次のコードを実行してください。
go run togglebutton.go
package main
import (
"github.com/mattn/go-gtk/gtk"
"os"
)
func main() {
gtk . Init(&os.Args)
window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)
window . SetTitle("Scale")
window . SetPosition(gtk.WIN_POS_CENTER)
window . Connect("destroy", gtk.MainQuit)
frame := gtk.NewFrame("Middle")
frame . SetBorderWidth(20)
align := gtk.NewAlignment(0.5, 0.5, 0.9, 0.9)
scale := gtk.NewHScaleWithRange(0, 100, 1)
scale . SetValue(50)
scale . Connect("value-changed", func() {
switch {
case scale.GetValue() >= 70:
frame.SetLabel("Hige")
case scale.GetValue() <= 30:
frame.SetLabel("Low")
default:
frame.SetLabel("Middle")
}
})
align . Add(scale)
frame . Add(align)
window . Add(frame)
window . ShowAll()
window . SetSizeRequest(400, 250)
gtk . Main()
}
ターミナルで、scale.go を保存したディレクトリに移動して、次のコードを実行してください。
go run scale.go
package main
import (
"github.com/mattn/go-gtk/gtk"
"os"
)
func main() {
gtk . Init(&os.Args)
window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)
window . SetTitle("Combo Box")
window . SetPosition(gtk.WIN_POS_CENTER)
window . SetBorderWidth(10)
window . Connect("destroy", gtk.MainQuit)
combo := gtk.NewComboBoxText()
combo . AppendText("Ubuntu")
combo . AppendText("CentOS")
combo . AppendText("Mint")
combo . SetActive(0)
label := gtk.NewLabel("Ubuntu")
align := gtk.NewAlignment(0.5, 0.5, 0, 0)
align . Add(label)
vbox := gtk.NewVBox(false, 0)
vbox . PackStart(combo,false, false, 0)
vbox . Add(align)
window . Add(vbox)
combo . Connect("changed", func() {
label.SetLabel(combo.GetActiveText())
})
window . ShowAll()
window . SetSizeRequest(400, 250)
gtk . Main()
}
ターミナルで、combobox.go を保存したディレクトリに移動して、次のコードを実行してください。
go run combobox.go
package main
import (
"github.com/mattn/go-gtk/gtk"
"os"
)
func main() {
gtk . Init(&os.Args)
window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)
window . SetTitle("Combo Box Entry")
window . SetPosition(gtk.WIN_POS_CENTER)
window . SetBorderWidth(10)
window . Connect("destroy", gtk.MainQuit)
combo := gtk.NewComboBoxTextWithEntry()
combo . AppendText("Ubuntu")
combo . AppendText("CentOS")
combo . AppendText("Mint")
combo . SetActive(0)
label := gtk.NewLabel("Ubuntu")
align := gtk.NewAlignment(0.5, 0.5, 0, 0)
align . Add(label)
vbox := gtk.NewVBox(false, 0)
vbox . PackStart(combo,false, false, 0)
vbox . Add(align)
window . Add(vbox)
combo . Connect("changed", func() {
label.SetLabel(combo.GetActiveText())
})
window . ShowAll()
window . SetSizeRequest(400, 250)
gtk . Main()
}
ターミナルで、comboboxentry.go を保存したディレクトリに移動して、次のコードを実行してください。
go run comboboxentry.go