Go에서 GUI를 사용하고 싶습니다!

10649 단어 5GUI

소개



제목대로입니다.
그러나 곳곳에서 말한대로 GUI는 Go의 서투른 부분이라고합니다.

이 기사에서는 andlabs/ui을 사용하여 간단한 GUI를 만들고 싶습니다.
(또한 상기 프로그램의 Wiki의 일본어 번역에 가까운 것이 되어 버립니다만 용서해 주세요)

입문



(GOPATH 및 go get에 대해서는 생략합니다)
이 예에서는 사용자가 이름을 입력하고 버튼을 누르면 표시하는 프로그램을 작성합니다.
먼저 아래 소스 코드를 실행합시다. 미세한 부분은 나중에 설명합니다.

main.go
package main

import (
    "github.com/andlabs/ui"
)

func main() {
    err := ui.Main(func() {
        name := ui.NewEntry()
        button := ui.NewButton("Greet")
        greeting := ui.NewLabel("")
        box := ui.NewVerticalBox()
        box.Append(ui.NewLabel("Enter your name:"), false)
        box.Append(name, false)
        box.Append(button, false)
        box.Append(greeting, false)
        window := ui.NewWindow("Hello", 200, 100, false)
        window.SetChild(box)
        button.OnClicked(func(*ui.Button) {
            greeting.SetText("Hello, " + name.Text() + "!")
        })
        window.OnClosing(func(*ui.Window) bool {
            ui.Quit()
            return true
        })
        window.Show()
    })
    if err != nil {
        panic(err)
    }
}

해설



Package UI 실행


var window ui.Window

먼저 ui.Window 형식의 전역 변수를 선언합니다.
Window는 다른 Control (TextField, Button 등)을 보관 유지합니다. Control을 표시하려면 Window에 추가되어 있어야 합니다. (그러나 Window는 Control이 아닙니다)
ui.Main(func() {...})
ui.Main() 는 UI의 메인 루프입니다. 이 중 Control, Window의 Show, Quit 등을 관리합니다.
Control.On<Action>(func(*ui.Control) {...})

이것은 Control의 이벤트 핸들러를 지정합니다.
Control에는 각각에 대응하는 이벤트 핸들러가 존재합니다.

UI 구축


name := ui.NewEntry()
button := ui.NewButton("Greet")
greeting := ui.NewLabel("")

이것들은 텍스트 필드, 버튼, 라벨을 만듭니다.
 stack := ui.NewVerticalStack(
            ui.NewLabel("Enter your name:"),
            name,
            button,
            greeting)

Package UI의 Control은 레이아웃 컨테이너를 사용하여 배치됩니다. 이것은 GTK+와 Qt와 같습니다.
수평과 수직으로 스택하는 것을 기본으로 하고, 이들은 폭이나 높이에 따라 바뀝니다.
이번에는 수직으로 배치하는 것을 사용합니다. 또한 label에 관해서는 아무것도 변경하지 않으므로 직접 정의합니다.
window = ui.NewWindow("Hello", 200, 100, false)
window.SetChild(stack)

이제 창을 만들 준비가 되었습니다.ui.NewWindow() 는 타이틀, 폭, 높이, 메뉴 바를 가지는지를 파라미터에 지정합니다.
Window는 Control을 하나만 가질 수 있지만 스택은 Control이므로 스택을 Window로 지정하기만 하면 됩니다.

이벤트


button.OnClicked(func() {
    greeting.SetText("Hello, " + name.Text() + "!")
})

이것은 버튼을 클릭했을 때의 이벤트 핸들러를 지정합니다.
이벤트 핸들러는 ui.Do() 가 실행된 후에 실행됩니다.
이벤트 핸들러는 안전하게 UI를 조작할 수 있으며 이벤트 핸들러가 실행되는 동안 다른 골 루틴에서 실행되지 않습니다.
이벤트 핸들러는 간단해야 합니다.
window.OnClosing(func() bool {
    ui.Stop()
    return true
})

사용자가 윈도우를 닫을 때 정상적으로 종료하려면 w.OnClosing()를 사용하십시오.
이 경우 ui.Stop() 를 호출하여 UI 메인 루프를 종료하고 Window를 닫기 위해 true를 반환합니다.

마무리


window.Show()

이것은 윈도우를 표시하기 만하면됩니다.

빌드하고 실행해 봅시다 (Window라면 go build -ldflags -H=windowsgui main.go)
다음과 같이 표시됩니다.

결론 실수 등이 있으면 트위터 인가 코멘트에 부탁합니다.

적용 가능한 샘플을 만들었습니다 -> 여기

좋은 웹페이지 즐겨찾기