Go fyne ui框架设置中文并打包到二进制文件
本文介绍了在Go语言中使用Fyne框架开发GUI应用程序时的一些技巧。首先,通过`os.Setenv`可以设置字体环境变量,支持中文显示和输入。其次,可以使用第三方库`findfont`来设置字体路径,但需要注意字体文件需要预先安装。最后,将字体文件打包到二进制文件中也是一个不错的选择,虽然文件较大,但在调试时不使用,打包时再放入。

::: hljs-center

:::

学习完go总琢磨自己做点什么东西玩,发现了fyne这个GUI框架,跟着文档简单弄吧弄吧还可以,但是由于Go的打包都是单文件所以字体文件都不能打包进去于是各种爬帖子,git issuse把方法总结一下

1. 使用os.Setenv

例如下面这样

package main

import (
    "fmt"
    "os"
)

func init()  {
    os.Setenv("FYNE_FONT","Alibaba-PuHuiTi-Medium.ttf")
}

func main() {
    loadUI()
    os.Unsetenv("FYNE_FONT")
}

这种开发调试时可以使用,可以支持中文都显示和输入.但是打包都时候不能把字体打包到二进制 这就很难受了

2. 使用三方库

findfont https://github.com/flopp/go-findfont

看csdn 和其他地方 都提到了这个库用来设置字体

    func init() {
        fontPaths := findfont.List()
        for _, path := range fontPaths {
            fmt.Println(path)
            //楷体:simkai.ttf
            //黑体:simhei.ttf
            if strings.Contains(path, "simkai.ttf") {
                os.Setenv("FYNE_FONT", path)
                break
            }
        }
    }
    
    func main() {
    loadUI()
    os.Unsetenv("FYNE_FONT")
}
    

其实这个和第一种方法是差不多的,这种是要提前系统有公用字体,如果考虑跨平台要设置每个平台的默认字体

3. 将字体打包到二进制文件(推荐)

这个不是首创,只是在fyne到issuse中找到到解决方案,感觉还是不错的,但是也有缺点就是打包后文件比较大,调试的时候慢,不过可以结合第一种来,调试的时候不使用,打包的时候在放进去

  • 首先安装官方的cmd工具
    go get fyne.io/fyne/cmd/fyne
  • 验证是否安装成功
fyne
Usage: fyne [command] [parameters], where command is one of:
  bundle, get, env, package, install, release, vendor, version or help
  ...
  • 将字体转为go文件
fyne bundle Alibaba-PuHuiTi-Medium.ttf > bundle.go
  • 自动写入头
head -n 9 bundle.go


// auto-generated

package main

import "fyne.io/fyne"

var resourceAlibabaPuHuiTiMediumTtf = &fyne.StaticResource{
    StaticName: "Alibaba-PuHuiTi-Medium.ttf",
    StaticContent: []byte{

打开文件会有一个警告 Warning: the file size is very large文件太大了 不过不用理会

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

import (
    "image/color"

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

type myTheme struct{}

// return bundled font resource
func (myTheme) TextFont() fyne.Resource     { return resourceAlibabaPuHuiTiMediumTtf }
func (myTheme) TextBoldFont() fyne.Resource { return resourceAlibabaPuHuiTiMediumTtf }

func (myTheme) BackgroundColor() color.Color      { return theme.DarkTheme().BackgroundColor() }
func (myTheme) ButtonColor() color.Color          { return theme.DarkTheme().ButtonColor() }
func (myTheme) DisabledButtonColor() color.Color  { return theme.DarkTheme().DisabledButtonColor() }
func (myTheme) IconColor() color.Color            { return theme.DarkTheme().IconColor() }
func (myTheme) DisabledIconColor() color.Color    { return theme.DarkTheme().DisabledIconColor() }
func (myTheme) HyperlinkColor() color.Color       { return theme.DarkTheme().HyperlinkColor() }
func (myTheme) TextColor() color.Color            { return theme.DarkTheme().TextColor() }
func (myTheme) DisabledTextColor() color.Color    { return theme.DarkTheme().DisabledTextColor() }
func (myTheme) HoverColor() color.Color           { return theme.DarkTheme().HoverColor() }
func (myTheme) PlaceHolderColor() color.Color     { return theme.DarkTheme().PlaceHolderColor() }
func (myTheme) PrimaryColor() color.Color         { return theme.DarkTheme().PrimaryColor() }
func (myTheme) FocusColor() color.Color           { return theme.DarkTheme().FocusColor() }
func (myTheme) ScrollBarColor() color.Color       { return theme.DarkTheme().ScrollBarColor() }
func (myTheme) ShadowColor() color.Color          { return theme.DarkTheme().ShadowColor() }
func (myTheme) TextSize() int                     { return theme.DarkTheme().TextSize() }
func (myTheme) TextItalicFont() fyne.Resource     { return theme.DarkTheme().TextItalicFont() }
func (myTheme) TextBoldItalicFont() fyne.Resource { return theme.DarkTheme().TextBoldItalicFont() }
func (myTheme) TextMonospaceFont() fyne.Resource  { return theme.DarkTheme().TextMonospaceFont() }
func (myTheme) Padding() int                      { return theme.DarkTheme().Padding() }
func (myTheme) IconInlineSize() int               { return theme.DarkTheme().IconInlineSize() }
func (myTheme) ScrollBarSize() int                { return theme.DarkTheme().ScrollBarSize() }
func (myTheme) ScrollBarSmallSize() int           { return theme.DarkTheme().ScrollBarSmallSize() }

主要就是重写 func (myTheme) TextFont() fyne.Resource 这个方法 加载自己的字体resourceAlibabaPuHuiTiMediumTtf

  • 然后就是在创建的时候使用自己的主题
    a := app.New()
    a.Settings().SetTheme(&myTheme{})

最后爬解决方案的时候发现一个比较好玩的东西,如果大家对fyne的配色方案不满意的可以自己定义配色方案哦. 附上git地址怎么使用大家自己研究下吧 传送门

文章的解决方案参考的解决方案: 传送门

咻兔哔
咻兔哔·2020年12月7日

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处

推荐文章

Macos Firefox 开启垂直侧边栏和隐藏顶部标签
其他技术

Macos Firefox 开启垂直侧边栏和隐藏顶部标签

本文介绍了如何在Mac上安装并自定义浏览器的垂直标签页和样式。首先,通过插件市场安装`Sidebery`插件,然后创建`userChrome.css`文件并添加自定义样式。接着,配置`chrome`文件夹的位置,并将`userChrome.css`文件放置到该目录内。最后,根据需要调整标题栏、侧边栏、工具栏等元素的样式。

5月26日53
给项目的GIT目录瘦瘦身
其他技术

给项目的GIT目录瘦瘦身

文章介绍了一系列操作步骤,包括查找大文件、删除指定大文件、重新标记过期缓存文件、回收过期缓存、重新用命令查看文件大小以及重新提交瘦身远程仓库。这些步骤旨在优化存储空间和提高系统性能。

3月21日17
Jetbrains Idea 2019.3.5 不能识别GOROOT SDK版本的解决办法
其他技术

Jetbrains Idea 2019.3.5 不能识别GOROOT SDK版本的解决办法

Jetbrains IDE 2019.3.5无法识别GOROOT SDK版本的问题,解决方法如下:1.进入Go的sdk src/runtime/internal/sys目录。2.编辑zversion.go文件,将go1.17替换成当前版本。参考资料:- https://blog.csdn.net/u011243684/article/details/123865556- https://youtrack.jetbrains.com/issue/GO-11588#focus=Comments-27-5127829.0-0

5月3日9
Golang GUI开发之Webview
其他技术

Golang GUI开发之Webview

本文介绍了如何在Go语言中创建一个简易的跨平台Webview应用。作者首先尝试了多种UI框架和库,如fyne、go-gtk等,但发现它们要么无法实现理想的界面效果,要么缺少某些关键功能。在不断的尝试过程中,发现了`webview/webview`包,它提供了一个浏览器壳子,可以使用各种CSS框架或Vue技术来实现想要的效果。然而,`webview/webview`不支持键盘操作,例如`command+c`、`command+v`和`command+a`等快捷键。为此,作者找到了一个临时的解决方案:在初始化时注入监听代码,以允许用户复制和粘贴文本,选择文件等。最后,通过使用`dialog`包和`webview/webview`库,实现了一个输入框和文件夹选择器的功能,并确保了代码的简洁性。

6月22日17