爬虫代码已复制

Golang fyne 编译报错:cannot use AppWindow 的解决方法

Golang 除了开发 Web 应用是一把好手外,还可以开发跨平台的桌面应用,fyne 就是 Golang 的其中一个 GUI 库,支持 Windows、macOS、Linux,虽然还不是很完美,但胜在 UI 还算好看,用来开发一些小的工具类桌面应用还是够用了。毕竟 Wails 或者 Electron 对于一个小工具来说有点重了。

因为现在开发桌面端应用比较少,fyne 也是现学现卖,在开发的过程中也遇到了一些诡异的问题,在此记录下来,免得以后头疼。

先看 go build 异常信息:

Build Error: go build -o /Users/user/scraping -gcflags all=-N -l .
# scraping/public
public/scraping.go:63:73: cannot use AppWindow (variable of type "fyne.io/fyne/v2".Window) as "fyne.io/fyne".Window value in argument to dialog.NewError: "fyne.io/fyne/v2".Window does not implement "fyne.io/fyne".Window (wrong type for method Canvas)
  have Canvas() "fyne.io/fyne/v2".Canvas
  want Canvas() "fyne.io/fyne".Canvas

从报错的信息来看,是 fyne 版本不兼容,导致了调用 AppWindow 时期望的类型与返回的类型不一致造成的。但习惯了 VSCode 的自动引用,刚开始还没留意到是引用的问题,因为前面都自动引用了 fyne.io/fyne/v2 ,还以为是函数调用的代码有问题,压根没想到 go get 安装的 v2,但引用时会引用到 v1 的版本,而且引用的位置不报错。估计是 go get fyne.io/fyne/v2@latest 时会默认把 v1 的版本也装上,这个没有去深究。

报错的 Golang 代码:

import (
	"errors"
	"log"
	"fyne.io/fyne/dialog"
)
func scraping(){
    if code == "" || title == "" || channel == "" || content == "" {
        dialog.ShowError(errors.New("code, title, channel, content can not be empty."), AppWindow)
        log.Println("code, title, content can not be empty.")
        return
    }
}

因为第一次使用 fyne 的 dialog.ShowError 函数,代码是查阅 fyne 官方文档写出来的,出错了就到网上搜索解决方法,也问了 DeepSeek、ChatGPT、Gemini、Gork,没有得到正确的解决方法。直到后来留意到 import 中的引用,这里的引用是写代码的时候 VSCode 自动加上的,再加上代码多的时候很少会往上翻到这个位置,所以平时都不怎么留意这个位置了。

给 fyne.io/fyne/dialog 加上 v2 的版本目录后,问题就迎刃而解了。

修正后能正确运行的代码:

import (
	"errors"
	"log"
	"fyne.io/fyne/v2/dialog" //改的这一行
)

一路过关斩将,终于把整个工具开发出来后,发现 fyne 会存在界面刷新的问题,更新内容后或者被控件遮挡后需要显式调用 Refresh() 来刷新界面,否则会出现 UI 的内容或线条无法正常显示等问题。而且表格控件在出现滚动条的情况下点击某一个单元格也会表格行跳动的问题。

这还是我第一次真正使用 fyne 来开发一个完整的桌面应用,在 macOS 上编译出来的可执行文件约 30MB,虽然功能简单只有几个按钮、表单控件及表格,但也算体验了 fyne 的一些主要特性,总体来说感觉还有很多不足之处,如果是大中型生产系统要慎用。