exp/drawパッケージでウインドウを出そう
今日もGo言語のお話。
試験中パッケージですが、exp/drawパッケージを使えばX-windowシステムでGUIなことができますよ。
今日はそんなお話です。
そういうわけで今日の話題の中心は「exp/draw」パッケージです。
気づいたら仕様が変わってたので、ついでに書こうかなと。
マウスがあったところに点を書きながら、おきたイベントをコンソールに垂れ流すプログラム。
package main import ( "exp/draw" "exp/draw/x11" "image" "fmt" ) func main() { //create and get the window win,err := x11.NewWindow() if err != nil { fmt.Printf("error.\n") return } //get image from Window img := win.Screen() fmt.Printf("%d, %d\n", img.Bounds().Size().X, img.Bounds().Size().Y) for { //when event is occored, it can pull EventChan() evnt := <-win.EventChan() if mouse,ok := evnt.(draw.MouseEvent); ok == true { //if event is mousemoving(with type-assersion) fmt.Printf("mouse : (%d, %d) : %d\n", mouse.Loc.X, mouse.Loc.Y, mouse.Buttons) if mouse.Buttons == 1 { img.Set(mouse.Loc.X, mouse.Loc.Y , image.White) win.FlushImage() } } else if key,ok := evnt.(draw.KeyEvent); ok == true { //if event is keypushing fmt.Printf("key : %d\n",key.Key) if key.Key == -101 { win.Close() break } } else if errev,ok := evnt.(draw.ErrEvent); ok == true{ fmt.Printf("error : %s",errev.Err.String()) } else if _,ok := evnt.(draw.ConfigEvent); ok == true { fmt.Printf("Config events\n") } else { fmt.Printf("unknown event. %T\n",evnt) return } } return }
簡単に言えば、
- ウインドウを作る。
- クリックしてる間にマウスが移動すればソコに点を打つ
- 'e'キーをクリックされたら終了(なんでqにしなかったのか当時の俺に聞きたい)
- イベントをとにかくコンソールへ垂れ流す
って動作をします。
draw.Windowがウインドウをあらわす構造体で、これはexp/draw/x11パッケージのNewWindow()で作れます。
イベントの発生はWindowが持ってるEventChan()メソッドのチャネルで知らせられます。
これは結構分かりやすくて、まぁやってることはソースのとおりです。
EventChan()はinterface{}型のチャネルなんで何が帰ってくるかわからんです。そういうわけでこういう風にifをつなげるか型switchで調べないといけないです。
あと、バッテンボタンでウインドウを消すと何故か
今日のところはそんな感じです。
そういうわけで、Windowでjpegを表示するの巻へ続きます
(次回予告)
keyword:Go言語 golang draw