fyne中文乱码的两种解决方法
方法一(使用 embed ):
embed 是 Go1.16 新特性,以后会有专门的介绍。
1、拷贝字体到项目目录
项目根目录下新建resource目录,把字体文件拷贝到其中。
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、结果
方法二(用fyne命令打包字体文件,适合旧版本):
1、拷贝字体到项目目录
在字体目录(C:\Windows\Fonts)中,拷贝中文字体文件到项目根·目录中(只能用.ttf,fyne2.3版本使用.ttc字体文件会报错)。
2、安装 fyne CLI
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
特别注意:上面的命令在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)
}
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