[golang] gui 라이브러리 fyne
1. 개요
Fyne
는 사용하기 쉬운 UI 툴킷과 Go로 작성된 앱 API로 데스크탑 및 모바일 환경을 지원합니다.
1.1. 사전 설정
Fyne 사용시 필요한 개발환경
- Go 버전 1.14 이상
- C 컴파일러 및 시스템 개발 도구
테스트 시스템 환경
분류 | 버전 |
---|---|
OS | Windows 10 |
go | 1.17 |
fyne | 2.1.2 |
1.2. 라이브러리 설치
> go get fyne.io/fyne/v2
2. 간단한 사용법
2.1. 예제 코드
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Hello") // 윈도우 명칭 지정
hello := widget.NewLabel("Hello World!")
w.SetContent(
container.NewVBox( // 컨텐츠 수직 정렬
hello,
widget.NewButton(
"Hi!", // 버튼 명칭
func() { hello.SetText("Welcome :)") }, // 버튼 이벤트
),
),
)
w.ShowAndRun() // 윈도우 출력
}
실행
> go run main.go
버튼 클릭 전 | 버튼 클릭 후 |
---|---|
2.2. 실행 파일 생성
윈도우에서 실행할 수 있는 .exe
파일을 생성한다.
실행 파일 생성이 필요한 라이브러리 설치
> go get fyne.io/fyne/v2/cmd/fyne
임의의 아이콘 파일 icon.png
을 프로젝트 루트 경로에 생성한다.
실행 파일 생성 명령어
> fyne install
3. 레이아웃 예시
3.1. dialog
다이얼로그는 팝업 형태의 창으로 정보를 보여주는 기능이다.
3.1.1. Information
정보확인용 다이얼로그
dialog.ShowInformation("title", "information message", window)
기본 설정은 영어 버튼이 표시되므로 수정하려면 아래와 같은 방식을 사용한다.
informationDialog := dialog.NewInformation("title", "information message", window)
informationDialog.SetDismissText("확인")
informationDialog.Show()
3.1.2. Confirm
확인/취소 버튼있는 다이얼로그
- 확인/취소에 따른 콜백 구현이 필요하다.
confirmDialog := dialog.NewConfirm("title", "프로그램을 종료하시겠습니까?", (func(res bool) { fmt.Println(res) }), w)
confirmDialog.SetDismissText("취소")
confirmDialog.SetConfirmText("확인")
confirmDialog.Show()
3.1.3. Error
에러 출력용 다이얼로그
err := errors.New("error message")
dialog.ShowError(err, w)
이외에도 다양한 다이얼로그 기능이 있다.
3.2. Entry(input) / Button
input
: 문자열을 입력하는 박스button
: 특정 기능을 동작 시키는 버튼
entry := widget.NewEntry()
entry.SetPlaceHolder("Entry")
입력한 문자열은 entry.Text
로 사용가능 하다.
button은 아이콘이 없거나 있는 버튼이 있다.
// input에 입력한 값을 label에 표시하는 버튼
button := widget.NewButton("Submit Text Button",
func() {
label.SetText(entry.Text)
})
// input에 입력한 값을 label에 표시하는 아이콘 버튼
iconButton := widget.NewButtonWithIcon("Submit Icon Button", theme.ConfirmIcon(),
func() {
label.SetText(entry.Text)
})
버튼 클릭 전 | 임의의 값 입력 후 버튼 클릭 |
---|---|
3.3. Check / Radio
check
: 여러 항목 중 복수개를 선택할 수 있는 체크 버튼
- 체크 박스 선택에 따른 핸들러 설정이 필요하다.
checkButton := widget.NewCheck("Check Button",
func(b bool) {
msg := fmt.Sprintf("check = %v", b)
label.SetText(msg)
})
radio
: 여러 항목 중 1개만 선택할 수 있는 라디오 버튼
- 라디오 버튼 선택에 따른 핸들러 설정이 필요하다.
options := []string{"1", "2", "3"}
radioButton := widget.NewRadioGroup(options,
func(s string) {
msg := fmt.Sprintf("radio = %s", s)
label.SetText(msg)
})
3.4. ProgressBar
progressbar
: 진행률, 진행상황, 진행여부 등 표시하는 기능
- SetValue(0) ~ SetValue(1) 범위로 동작
progress := widget.NewProgressBar()
infProgress := widget.NewProgressBarInfinite()
go func() {
for i := 0.0; i <= 100; i++ {
progress.SetValue(i / 100)
time.Sleep(time.Millisecond * 100)
}
}()
4. 한글 폰트 설정
fyne 라이브러리 사용시 한글을 사용하면 글자가 깨져서 UI로 표시된다.
폰트 설정 전 | 폰트 설정 후 |
---|---|
한글폰트를 지정하지 않아 생긴 문제로 한글 폰트를 별도로 지정
하면 문제가 해결된다.
- key :
FYNE_FONT
- value :
(폰트파일 이름).ttf
func main() {
// 한글 폰트 지정(실행 파일과 동일경로에 폰트파일 위치)
os.Setenv("FYNE_FONT", "NanumGothic.ttf")
...
위와 같이 golang에서 환경 변수를 지정한다.