想用Golang写一个漂亮的GUI?看看这个教程!

4,140 阅读2分钟
  1. 简介

lxn/walk 是一个用于创建 Windows 图形用户界面(GUI)的 Go 语言库。它提供了一套简单易用的 API,可以用来创建各种窗口、对话框、按钮、标签、文本框等控件。在本教程中,我们将学习如何使用 lxn/walk 来创建一个简单的 GUI 应用程序。

  1. 安装

首先,我们需要安装 lxn/walk。可以通过在终端中使用以下命令来进行安装:

go get github.com/lxn/walk
go get github.com/akavel/rsrc ## 这个工具是用来生成.syso文件的,如果再cmd终端找不到rsrc命令,可以到GoPath或者GoRoot的/pkg/mod/github.com/akavel/rsrc目录下,执行go build命令,生成rsrc.exe文件,防止到/bin目录下
  1. 创建窗口

创建窗口是第一步。下面的代码演示了如何创建一个简单的窗口:

package main

import (
    "github.com/lxn/walk"
)

func main() {
    mw, _ := walk.NewMainWindow()
    mw.SetTitle("Hello, World!")
    mw.SetSize(walk.Size{Width: 300, Height: 200})
    mw.SetLayout(walk.NewVBoxLayout())
    mw.Show()
    mw.Run()
}

这个程序会创建一个带有标题“Hello, World!”的窗口,并将其显示在屏幕上。NewMainWindow 函数用来创建一个主窗口对象,SetTitle 函数用来设置窗口标题,SetSize 函数用来设置窗口大小,Show 函数用来显示窗口。最后,我们使用 walk.Run 函数来启动应用程序的消息循环,使窗口可以响应用户的操作。

  1. 创建清单文件app.manifest,这个是应用程序配置元数据用的

输入如下内容:

<?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>

然后在终端使用命令rsrc将manifest文件转成syso文件

rsrc -manifest app.manifest -o app.syso # 如果不改版本,只要生成一次就行,可以重复使用
  1. 编译独立的exe文件,并双击运行即可 命令如下:
go build -ldflags="-H windowsgui"   

运行结果:

image.png

  1. 添加控件

下一步是添加控件。下面的代码演示了如何在窗口中添加一个标签和一个按钮:

package main

import (
    "github.com/lxn/walk"
)

func main() {
    mw, _ := walk.NewMainWindow()
    mw.SetTitle("Hello, World!")
    mw.SetSize(walk.Size{300, 200})

    label, _ := walk.NewLabel(mw)
    label.SetText("Hello, World!")
    label.SetBounds(walk.Rectangle{20, 20, 100, 20})

    button, _ := walk.NewPushButton(mw)
    button.SetText("Click me!")
    button.SetBounds(walk.Rectangle{20, 50, 80, 30})
    button.Clicked().Attach(func() {
        walk.MsgBox(mw, "Message", "Hello, World!", walk.MsgBoxIconInformation)
    })

    mw.Show()
    walk.Run()
}

这个程序在之前的代码的基础上添加了一个标签和一个按钮。NewLabel 函数用来创建一个标签对象,SetText 函数用来设置标签文本,SetBounds 函数用来设置标签位置和大小。同样,我们使用 NewPushButton 函数来创建一个按钮对象,SetText 函数用来设置按钮文本,SetBounds 函数用来设置按钮位置和大小。我们还添加了一个回调函数,当按钮被点击时,它会显示一个对话框,提示用户“Hello, World!”。

显示结果:

image.png

  1. 未完待续......