golang Gui Fyne 使用笔记

  • admin
  • go笔记
  • 2021-07-02 10:02
  • 750已阅读
简介 golang Gui Fyne 使用笔记 写了一些实例



首先放上官方 官网 文档 仓库等等的地址

https://fyne.io/  官网

https://developer.fyne.io/ 官网文档

https://pkg.go.dev/fyne.io/fyne/v2 godoc文档

https://github.com/fyne-io  github团队地址

https://github.com/fyne-io/fyne  github主仓库

https://github.com/fyne-io/fyne-x github 额外的仓库  内含 文件tree等等

https://github.com/fyne-io/defyne  github IDE仓库 官方做的IDE


如何安装

百度上一堆

https://developer.fyne.io/started/ 这是官方文档的


注意事项:

cgo

有gl组织的依赖库需要 开启cgo 请确认CGO_ENABLED 是否启用

如果gl下载不下来 同时你确定你配置过代理 GOPROXY 并开启了 GO111MODULE请手动 go get 错误提示的包


程序员的第一件事 hello word

依旧是百度一堆 教程

https://developer.fyne.io/started/firstapp.html 这个是 官方的

说下官方 和百度那些教程没有说清楚的一些

首先 官方崇尚简洁风 喜欢花里胡哨的ui的 个性化强的ui可以绕路用electron

因为这个适合快速开发花里胡哨的ui而且不怕需求变动

fyne 不支持组件 容器 布局 自定义样式啥的 只有一两个参数

举个例子 你想改列表的 按钮 颜色 只能在 自定义风格         https://developer.fyne.io/tutorial/custom-theme

然后这个是全局的 不止你列表变了 你其他地方全变变了


如何拓展

https://developer.fyne.io/tutorial/  官方的文档说明



目前我发现注意事项

快捷键绑定  目前不支持后台运行 也就是必须是前台窗口 是活动窗口

列子:例如obs快捷键录屏 是可以在游戏录屏 fyne不行

已经提交建议给官方 官方采纳了 https://github.com/fyne-io/fyne/issues/2304


然后我发现布局 组件 容易 都是可以互相套娃的 他们是同一个接口约束

fyne.CanvasObject




下面展示一下我的代码方便理解

https://github.com/yangguangwuwu/FTL-autosave/blob/master/main.go  


func initWindows入口函数


    App := app.New()    
    App.Settings().SetTheme(CnTheme{})
    Window := App.NewWindow("FLT存档管理")
    Window.Resize(fyne.NewSize(750, 600))
    ctrlTab := desktop.CustomShortcut{KeyName: fyne.KeyTab, Modifier: desktop.ControlModifier}
    Window.Canvas().AddShortcut(&ctrlTab, func(shortcut fyne.Shortcut) {
        log.Println("We tapped Ctrl+Tab")
    })
    toolbar := widget.NewToolbar(
        //widget.NewToolbarAction(theme.DocumentSaveIcon(), func() {
            //log.Println("save ")
        //}),
        //widget.NewToolbarAction(theme.FolderOpenIcon(), func() {
            //log.Println("load ")
        //}),
        //widget.NewToolbarSpacer(),
        //widget.NewToolbarAction(theme.HelpIcon(), func() {
            //log.Println("Display help")
            //w := App.NewWindow("帮助")
            //w.Resize(fyne.NewSize(700, 550))
            //w.SetContent(widget.NewCard("帮助","使用说明",nil))
            //w.Show()
        //}),
    )
    help := widget.NewLabel("首先,退回游戏主菜单。然后,在列表选择载入的存档,点击载入,最后在游戏主菜单继续游戏!")
    tabs := container.NewAppTabs(
        container.NewTabItemWithIcon("功能",theme.HomeIcon(), container.NewGridWithColumns(1,AutoSaveLog()),),
        container.NewTabItemWithIcon("帮助",theme.HelpIcon(), widget.NewCard("帮助","帮助说明",help)),
    )
    tabs.SetTabLocation(container.TabLocationLeading)
    grid := container.NewBorder(
        toolbar,
        nil,
        nil,
        nil,
        tabs,
    )
    Window.SetContent(grid)
    Window.ShowAndRun()




下面说下数据绑定 官方是提供了 双向数据绑定的

说句题外话 这个绑定对我很不友好   不够自由

例如 列表只能绑一个 []string  我们一般习惯绑[]map[string]interface{}


https://developer.fyne.io/tour 官方的带代码示例的教程


https://developer.fyne.io/tour/binding/ 数据绑定


我的示例只用了 List Data

https://developer.fyne.io/tour/binding/list


https://github.com/yangguangwuwu/FTL-autosave/blob/master/main.go  


func AutoSaveLog() fyne.CanvasObject {
    data := binding.BindStringList(&AutoFilesName)
    AutoFilesListName = data
    list := widget.NewListWithData(data,func() fyne.CanvasObject {
            return container.NewBorder(nil,nil,nil,widget.NewButtonWithIcon("载入",theme.ContentUndoIcon(), func() {
        }),widget.NewLabel("test"))
        },func(i binding.DataItem, o fyne.CanvasObject) {
            o.(*fyne.Container).Objects[0].(*widget.Label).Bind(i.(binding.String))
            o.(*fyne.Container).Objects[1].(*widget.Button).OnTapped = func() {
            filename,_ := i.(binding.String).Get()
            LoadAutoSave(filename)
        }
    })
    return widget.NewCard("自动存档","",list)
}



注意事项:

widget.NewListWithData 第一个参数是绑定的数据 要特定接口的数据  第二个参数才是第一个回调函数

widget.NewList 第一个回调函数 相当于模板 第二个函数是赋值的 相当于写模板变量  不过都是fyne.CanvasObject   第二是操作fyne.CanvasObject 找到之前的组件 或容器或布局 最终操作显示内容的fyne.CanvasObject对象


上一篇:web框架gin的安装

文章评论