Golang Walk 增加 Windows 应用图标

更新日期: 2025-07-31 阅读次数: 83 字数: 533 分类: golang

用 Golang Walk 开发了一个 Windows GUI 应用程序,用于批量生成决赛证书。 基础功能已经完成。目前唯一的遗憾是应用程序没有图标。为了让这个应用程序看起来更专业,我决定为它添加一个图标。

先看最终效果:

显示效果

Golang Walk Windows 应用图标

重新生成 syso 文件

参考 Github 上的一个套路:

https://github.com/lxn/walk/issues/361

首先去 iconfont 网站下载一个免费的图标文件,然后将其转换为 ICO 格式。可以使用在线工具或软件来完成这个转换。

然后将生成的 ICO 文件放在项目目录下,例如 main.ico。

重新生成 syso 文件,使用以下命令:

rsrc -manifest main.manifest -ico main.ico -o rsrc.syso

其实就是在之前的基础上,增加了 -ico main.ico 参数。

修改 golang 代码

需要在代码中引用这个图标文件。可以在 main.go 文件中添加以下代码:

// number 2 is resource ID printed by RSRC.exe while making accounting.syso
var appIcon, _ = walk.NewIconFromResourceId(2)

func main() {
	var outTE *walk.TextEdit

	decl.MainWindow{
		Title:  "决赛证书批量生成工具",
		Icon:   appIcon, // 使用上面定义的图标
		Size:   decl.Size{Width: 600, Height: 400},
		Layout: decl.VBox{},
	// ...

如果不加 Icon: appIcon,则不会显示图标,只会看到文件目录里 exe 文件有了图标,但运行时窗口没有图标。

重新编译 exe 文件

go build -ldflags="-H windowsgui"

然后打开就可以看到图标了。

resource ID 问题

如果直接使用上面链接的里的 resource ID 3,可能会导致运行时错误:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x20 pc=0x7a511c]

然后我在另一个 issue 中找到了解决方案,就是替换 3 为 2:

Maybe you can try to change resource ID 3 to 2 if you are using akavel/rsrc v0.10

这也太抽象了,虽然确实可以解决问题,但我还是不太明白为什么。

然后有人推荐了 https://github.com/josephspurrier/goversioninfo 这个工具来解决。 有空再看看吧。

如何确定 syso 文件中的 icon 文件的 resource ID?

https://github.com/akavel/rsrc/issues/20

有人 fork 了一个版本,可以输出 icon 对应的 resource ID.

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式

tags: golang walk