0
点赞
收藏
分享

微信扫一扫

GoLang图形用户界面编程实战(GUI编程)—fyne框架(三)

fyne中文乱码的两种解决方法

方法一(使用 embed ):

embed 是 Go1.16 新特性,以后会有专门的介绍。


1、拷贝字体到项目目录

项目根目录下新建resource目录,把字体文件拷贝到其中。

GoLang图形用户界面编程实战(GUI编程)—fyne框架(三)_根目录

2、在resource目录下新建 resource_export.go文件。

resource_export.go 代码:

package resource

import _ "embed"

//go:embed logo.png
var Logo []byte

//go:embed Deng.ttf
var DENGttf []byte

3、在根目录下 新建 main.go 和 theme.go

main.go代码

package main

import (
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/widget"
)

func main() {

	myApp := app.New()
	// 设置主题
	myApp.Settings().SetTheme(&MyTheme{})
	myWindow := myApp.NewWindow("边城lang仔")
	label := widget.NewLabel("边城lang仔 GoLang_CUI编程")
	myWindow.SetContent(label)
	myWindow.Show()
	myApp.Run()
}

theme.go代码:

package main

import (
    _ "embed"
    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/theme"
    "image/color"
    "win4/resource"
)

type MyTheme struct{}

var _ fyne.Theme = (*MyTheme)(nil)

func (m MyTheme) Font(s fyne.TextStyle) fyne.Resource {
    //return theme.DefaultTheme().Font(s)   
    return &fyne.StaticResource{
       StaticName:    "Deng.ttf",
       StaticContent: resource.DENGttf,
    }
}

func (*MyTheme) Color(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color {
    return theme.DefaultTheme().Color(n, v)
}

func (*MyTheme) Icon(n fyne.ThemeIconName) fyne.Resource {
    return theme.DefaultTheme().Icon(n)
}

func (*MyTheme) Size(n fyne.ThemeSizeName) float32 {
    return theme.DefaultTheme().Size(n)
}

4、结果

GoLang图形用户界面编程实战(GUI编程)—fyne框架(三)_bundle_02



方法二(用fyne命令打包字体文件,适合旧版本):

1、拷贝字体到项目目录

在字体目录(C:\Windows\Fonts)中,拷贝中文字体文件到项目根·目录中(只能用.ttffyne2.3版本使用.ttc字体文件会报错)。

GoLang图形用户界面编程实战(GUI编程)—fyne框架(三)_命令行工具_03

GoLang图形用户界面编程实战(GUI编程)—fyne框架(三)_bundle_04


2、安装 fyne CLI

GoLang图形用户界面编程实战(GUI编程)—fyne框架(三)_bundle_05

go install fyne.io/fyne/v2/cmd/fyne/fyne@latest

go install fyne.io/fyne/v2/cmd/fyne/fyne@latest


go install fyne.io/fyne/v2/cmd/fyne@latest

在终端中执行上面命令。安装完成后

fyne --version

可以查看fyne版本

fyne CLI 是fyne命令行接口工具。


3、使用 fyne CLI打包

在项目根目录下执行下列命令(使用windows命令行工具 ,win+R -cmd),生成bundled.go文件。

fyne bundle deng.ttf >> bundled.go
fyne bundle -append dengb.ttf >> bundled.go

GoLang图形用户界面编程实战(GUI编程)—fyne框架(三)_根目录_06

特别注意:上面的命令在windows命令行工具中执行,不能使用powershell,也不能在编辑器中的终端中执行(vscode 或 goland中都不可以)。因为生成后的bundled.go 应该是 utf-8格式。powershell会生成 utf-16的字符编码文件,导致编译失败。


4、创建主题theme.go

创建一个自己的theme (也就是重写theme)

package main

import (
	"image/color"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/theme"
)

type myTheme struct{}

var _ fyne.Theme = (*myTheme)(nil)

// return bundled font resource
func (*myTheme) Font(s fyne.TextStyle) fyne.Resource {
	if s.Monospace {
		return theme.DefaultTheme().Font(s)
	}
	if s.Bold {
		if s.Italic {
			return theme.DefaultTheme().Font(s)
		}
		return resourceDengbTtf
	}
	if s.Italic {
		return theme.DefaultTheme().Font(s)
	}
	return resourceDengTtf

}

func (*myTheme) Color(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color {
	return theme.DefaultTheme().Color(n, v)
}

func (*myTheme) Icon(n fyne.ThemeIconName) fyne.Resource {
	return theme.DefaultTheme().Icon(n)
}

func (*myTheme) Size(n fyne.ThemeSizeName) float32 {
	return theme.DefaultTheme().Size(n)
}

GoLang图形用户界面编程实战(GUI编程)—fyne框架(三)_根目录_07

Font方法中的两个返回值,到生成的bundled.go中可以找到。resourceDengTtf,resourceDengbTtf。

字体称变量设置一致后,字体文件可移除。theme.go 中resourceDengTtf名字会报红不必理会。


5、修改 main.go 代码,使用主题。

package mainimport (
    "fyne.io/fyne/v2/app"    "fyne.io/fyne/v2/widget")

func main() {

    myApp := app.New()
    // 设置主题
    myApp.Settings().SetTheme(&myTheme{})
    myWindow := myApp.NewWindow("边城lang仔")
    label := widget.NewLabel("边城lang仔 GoLang_CUI编程")

    myWindow.SetContent(label)

    myWindow.Show()
    myApp.Run()
}

6、运行结果

go run .\main.go .\theme.go .\bundled.go


GoLang图形用户界面编程实战(GUI编程)—fyne框架(三)_命令行工具_08



举报

相关推荐

0 条评论