Go walk 使用经历

在 2024 年 12 月的时候我试着写了人生的第一个 Windows GUI 软件,别看屏幕了,Go walk (去散步)

加载中...
- -

虽然非常简陋但也算是自己第一次没怎么使用框架开发的感觉,同时当时无论如何都想使用 Go 来着,正好看到了这么符合主题的框架,同时以技术栈呼应主题的双关

所以今天再次翻到这份笔记的时候感触良多,尤其是这个软件甚至支持 i18n,在如今 AI Coding 盛行的时候,很难想象当时我居然古法手搓的还支持多语言,主要是我印象中这个框架不原生支持来着,不过因为不好用,也忘记了

感想写到这里,下方是笔记原文

文章仅用于发布当时的笔记,不保证准确性,另外不推荐 walk 架构

环境

GoLand 新建一个 Go 工程后,默认会初始化 go.mod,若无此文件,可以使用命令

1
go mod init

安装 walk

1
go get github.com/tailscale/walk

工程

下载 rsrc 工具 并配置好 PATH 后,安装 rsrc

1
go get github.com/akavel/rsrc

创建 Manifest 文件 main.manifest,内容如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
        </windowsSettings>
    </application>
</assembly>

合并到 Go 程序

1
rsrc -manifest main.manifest -o rsrc.syso

倒计时开发

 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main

import (
	"fmt"
	"github.com/tailscale/walk"
	. "github.com/tailscale/walk/declarative"
	"log"
	"runtime"
	"time"
)

func main() {
	app, err := walk.InitApp()
	if err != nil {
		log.Fatal(err)
	}

	var timeRemain *walk.Label
	var flag bool
	ok := true

	MainWindow{
		Title:   "Hi walk",                   // 窗口标题
		MinSize: Size{Width: 60, Height: 40}, // 最小尺寸
		Layout:  VBox{MarginsZero: true},     // 窗口布局,垂直盒子布局
		Children: []Widget{
			Label{
				AssignTo: &timeRemain,
				Text:     "开始计时 10 秒",
			},
			PushButton{
				Text: "开始计时",
				OnClicked: func() {
					if flag {
						return
					}
					flag = true
					// 计时
					go func() {
						for i := 10; i > 0; i-- {
							if ok {
								time.Sleep(1 * time.Second)
								timeRemain.SetText(fmt.Sprintf("倒计时 %d 秒", i))
							} else {
								runtime.Goexit()
							}
						}
						walk.MsgBox(nil, "提醒", "时间到", walk.MsgBoxIconInformation)
						flag = false
					}()
				},
			},
			PushButton{
				Text: "停止计时",
				OnClicked: func() {
					flag = false
					ok = false
					timeRemain.SetText("计时已经停止")
					time.Sleep(1 * time.Second)
					timeRemain.SetText("开始计时 10 秒")
				},
			},
		},
	}.Create()

	app.Run()
}

新窗口

打开一个新窗口

 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package main

import (
	"github.com/tailscale/walk"
	. "github.com/tailscale/walk/declarative"
	"log"
)

type MyMainWindow struct {
	*walk.MainWindow
}

func main() {
	app, err := walk.InitApp()
	if err != nil {
		log.Fatal(err)
	}

	mw := new(MyMainWindow)

	MainWindow{
		AssignTo: &mw.MainWindow,
		Title:    "Hi walk",                     // 窗口标题
		MinSize:  Size{Width: 400, Height: 500}, // 最小尺寸
		Size:     Size{Width: 400, Height: 500}, // 尺寸
		Layout:   VBox{},                        // 窗口布局
		Children: []Widget{
			Label{
				Text:      "请选择模式",
				Alignment: AlignHCenterVCenter,
			},
			PushButton{
				Text:      "短时间高频休息",
				OnClicked: mw.shortLayout,
			},
			PushButton{
				Text: "长时间低频休息",
			},
		},
	}.Create()

	app.Run()

}

func (mw *MyMainWindow) shortLayout() {
	shortMainWindow := new(MyMainWindow)
	MainWindow{
		AssignTo: &shortMainWindow.MainWindow,
		Title:    "短时间高频休息",
		MinSize:  Size{Width: 400, Height: 500}, // 最小尺寸
		Size:     Size{Width: 400, Height: 500}, // 尺寸
		Layout:   VBox{},
		Children: []Widget{
			Label{Text: "Hello"},
		},
	}.Create()

	shortMainWindow.Running()
}

Reference

go walk 两天的使用情况,心中默默放弃

Golang—walk学习(一)

walk 控件学习第一节

This post is licensed under CC BY-NC-SA 4.0 by the author.

访问统计

自 2025-02-08 起的访问统计

使用 Hugo 构建 | 主题 StackJimmy 设计 | 修改自 yexca