Type Here to Get Search Results !

Fyne 한글이 깨져 보일 때, 한글 폰트 설정

 


Go언어와 Fyne을 사용하여 GUI를 만들 때, 위의 이미지처럼 한글이 깨져 보이는 문제가 발생하곤 합니다. 이는 기본적으로 폰트 설정과 관련이 있는 문제로 Fyne에서 기본 폰트가 한글을 지원하지 않기 때문에 한글을 포함한 문자를 제대로 표시하려면 한글 폰트를 설정해야 합니다. 윈도우즈 환경에서 Fyne GUI를 이용할 때 한글 폰트를 설정하는 방법을 살펴보겠습니다.


구글링을 해보면 "FYNE_FONT"의 값을 설정하는 방법과, 커스텀 테마를 설정하는 방법 등이 있습니다. 여기서는 간단하게 FYNE_FONT를 설정하는 코드를 추가하는 방법을 보이도록 하겠습니다. 이는 https://github.com/mikan/arpg 의 코드를 참조하여 작성된 것입니다.


package main

import (
    "fmt"
    "os"
    "runtime"

    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/container"
    "fyne.io/fyne/v2/widget"
)

func overwriteFyneFont() {
    if runtime.GOOS == "windows" {
        windDir := os.Getenv("WINDIR")
        if len(windDir) == 0 {
            return
        }
        fontPath := determineWindowsFont(windDir + "\\Fonts")
        if err := os.Setenv("FYNE_FONT", fontPath); err != nil {
            fmt.Printf("WARNING: failed to set FYNE_FONT=%s: %v\n", fontPath, err)
        }
    }
}

func determineWindowsFont(fontsDir string) string {
    font := "malgun.ttf"
    if _, err := os.Stat(fontsDir + "\\" + font); err == nil {
        return fontsDir + "\\" + font
    }
    font = "H2GTRM.TTF"
    if _, err := os.Stat(fontsDir + "\\" + font); err == nil {
        return fontsDir + "\\" + font
    }
    font = "NGULIM.TTF"
    if _, err := os.Stat(fontsDir + "\\" + font); err == nil {
        return fontsDir + "\\" + font
    }
    return ""
}

func main() {

    overwriteFyneFont()
    a := app.New()
    w := a.NewWindow("한글 테스트")
    label := widget.NewLabel("안녕하세요!")
    content := container.NewVBox(label)
    w.SetContent(content)
    w.Resize(fyne.NewSize(300, 200))
    w.ShowAndRun()
} 


main 메서드가 실행될 때 overwriteFyneFont 메서드가 실행됩니다. 윈도우즈 운영체제에서는 일반적으로 폰트는 윈도우즈 폴더 내 Fonts 폴더에 있습니다. 여기에 있는 폰트를 이용하여 시작하자마자 FYNE_FONT 설정을 하는 것입니다.


어떠한 한글 폰트를 이용할 지는 determineWindowsFont 메서드에서 정해집니다. Fyne에서 사용할 수 있는 폰트의 확장자는 TTF입니다. TTF 확장자를 가진 한글 폰트를 이용해야 하는데, 윈도우즈에 기본적으로 있을 것으로 보이는 폰트가 생각보다 많지 않습니다. 처음 시도하는 폰트는 "맑은 고딕"입니다. 맑은 고딕이 없다면 한양고딕, 굴림 폰트를 찾아보고 없으면 빈 문자열을 반환합니다. 맑은고딕, 한양고딕, 굴림 중 하나는 반드시 있을 것이라 생각되는데, 이는 코딩 시 적절히 수정하시면 될 듯 합니다.


위의 코드를 실행하면 다음과 같이 한글이 깨지지 않고 나타납니다.


잡담. Go언어를 사용하면서 아쉬운 것 중 하나는 대표적인 GUI가 없다는 것입니다. python의 tkinter와 같이 기본적인 GUI가 있었으면 좋겠는데, 이것저것 알아보다가 Fyne를 이용하고 있습니다. 본래 "모두의 프린터"를 개발하신 피로곰님의 글을 보면서 walk를 이용해볼까 하는 생각도 있었는데, 저에게는 어렵게 느껴졌습니다. Go언어에도 python의 tkinter마냥 편한 것이 있었으면 좋겠습니다.

댓글 쓰기

0 댓글
* Please Don't Spam Here. All the Comments are Reviewed by Admin.