给紫玉写了一个工具方便她处理Excel,之前一直是黑框的,需要她自己复制数据进去计算,最近有时间于是使用Fyne写了个界面。
记录下 Fyne 使用遇到的问题。总体来说可以满足简单的图形需求。
mac交叉编译win报错
1 2 3
| fyne package -os windows -icon 1.jpg # runtime/cgo gcc_libinit_windows.c:7:10: fatal error: 'windows.h' file not found
|
brew install mingw-w64
还是不行
看文档。交叉编译不能直接用 fyne package
参考文档 https://developer.fyne.io/started/cross-compiling
发现主要是设置 CGO_ENABLED、和CC两个环境变量,于是尝试:
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc fyne package -os windows -icon 1.jpg
成功
Fyne解决中文乱码
配置字体
配置字体有两种方式
第一种方式
1.安装官方的 cmd 工具
1
| go get fyne.io/fyne/cmd/fyne
|
2.准备好字体文件(建议使用 ttf 字体格式)
1
| 字体文件下载地址 https://www.fonts.net.cn/
|
3.使用fyne把字体文件打包成二进制格式
1
| fyne bundle fonts.ttf >> bundle.go
|
4.需要创建一个 theme 目录 把 bundle.go 放入其中
**5.修改 bundle.go 文件 **把 package 和 import 处理下
1 2
| package theme import "fyne.io/fyne/v2"
|
6.在 theme 文件夹新建 theme.go 文件 并添加以下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| package theme
import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/theme" "image/color" )
type MyTheme struct{ }
var _ fyne.Theme = (*MyTheme)(nil)
func (m MyTheme) Font(fyne.TextStyle) fyne.Resource {
return resourceNotoSansSCTtf }
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) }
|
第二种方式
1.在项目中新建一个 theme 目录
2.在 theme 文件夹中 新建 fonts 目录
3.把下载的 ttf 格式的字体文件放置到 fonts 目录中
4.在 theme 目录中 新建 theme.go 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| package theme
import ( _ "embed" "fyne.io/fyne/v2" "fyne.io/fyne/v2/theme" "image/color" )
var ( NotoSansSC []byte )
type MyTheme struct{ }
var _ fyne.Theme = (*MyTheme)(nil)
func (m MyTheme) Font(fyne.TextStyle) fyne.Resource {
return &fyne.StaticResource{
StaticName: "NotoSansSC.ttf", StaticContent: NotoSansSC, } }
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) }
|
在 main.go 中引入并使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package main
import ( "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" "fyne/src/theme" )
func main() {
a := app.New() a.Settings().SetTheme(&theme.MyTheme{ }) w := a.NewWindow("你好")
hello := widget.NewLabel("你好 Fyne!") w.SetContent(container.NewVBox( hello, widget.NewButton("嗨!", func() {
hello.SetText("欢迎 :)") }), ))
w.ShowAndRun() }
|