您现在的位置是:网站首页> Go语言
Go 跨平台GUI技术相关收集
- Go语言
- 2025-02-26
- 915人已阅读
Go 跨平台GUI技术相关收集
在Windows 10专业版搭建Fyne(Go 跨平台GUI)开发环境
在Windows 10专业版搭建Fyne(Go 跨平台GUI)开发环境
目录
强制设置环境变量,最好在终端管理员Shell里执行: setx ANDROID_NDK_HOME "C:\android-ndk-r20b"
一 Fyne 和 MSYS2简介
1.1 Fyne
fyne 是一个用于 Go 语言的 GUI 包,它提供了一个简单而强大的界面构建框架。
fyne 的核心是一个事件驱动的渲染引擎,它可以轻松地创建具有丰富交互性的图形界面。该框架提供了丰富的内置控件,如按钮、文本框、标签、列表等,并且支持自定义控件的创建。
此外,fyne 还提供了一系列的工具和函数,用于处理界面事件、绘制图形、处理图像和字体等。它还支持跨平台开发,可以在 Windows、macOS 和 Linux 等多个操作系统上运行。
总的来说,fyne 是一个非常强大和灵活的 GUI 包,可以帮助开发人员快速创建具有高交互性的图形界面。它简单易用,并且具有很高的可扩展性,可以满足各种不同的界面需求。
1.2 MSYS2
MSYS2 是一个基于 MinGW-w64 的发行版,它提供了一个完整的 POSIX 工具链和开发环境,可以让开发人员在 Windows 上轻松地进行开源开发。
MSYS2 包括了许多流行的开源工具,如 GCC、GDB、Make、Python、Perl 等等。它还提供了一个 Bash shell,可以让开发人员像在 Linux 上一样使用命令行。
使用 MSYS2,开发人员可以编译、调试和运行各种开源软件,包括 C、C++、Java、Python 等语言的程序。此外,MSYS2 还可以与其他 Windows 应用程序无缝集成,例如 Microsoft Visual Studio、 Eclipse CDT 等。
总的来说,MSYS2 是一个非常强大和灵活的发行版,为开发人员在 Windows 上进行开源开发提供了一个完整的解决方案。
二 安装 MSYS2
2.1 下载MSYS2
2.2 安装
选择安装目录(根据个人喜好进行选择),如图1:
安装完成,如图2:
启动UCRT64环境:
执行以下安装命令:
pacman -Syu
pacman -S git mingw-w64-x86_64-toolchain
pacman -S mingw-w64-ucrt-x86_64-gcc
gcc --version
各环境的差别,
2.3 环境变量设置
环境变量设置包括windows环境变量设置和UCRT64两个环境,Windows 环境需要加入:
UCRT64环境变量PATH加入Go的bin目录:
执行:
source .bashrc
go version
go install fyne.io/fyne/v2/cmd/fyne@latest
正确显示go版本及安装fyne命令行,即配置成功!
2.4 检测安装环境
解压后双击exe文件,显示如下则环境配置成功!
注意:使用Goland进行开发时,编译环境需加入:
CC=gcc;CGO_ENABLED=1;GOARCH=amd64;GOOS=windows
CC=gcc;CGO_ENABLED=1;GOARCH=amd64;GOOS=windows
否则报错:
也可使用mingw64编译配置如下:
1.下载mingw64:https://winlibs.com/
下载最新的 “MinGW-w64 GCC standalone” 版本(推荐 posix-seh 版本)。
2. 解压 MinGW-w64
下载完成后,将压缩包解压到 C:\mingw-w64(或其他你喜欢的目录)。
例如:
C:\mingw-w64\mingw64
3. 配置环境变量
右键 此电脑 → 属性 → 高级系统设置 → 环境变量。
在 系统变量 里找到 Path,点击 编辑。
添加以下路径(根据你的安装路径调整):
注意:用MSYS2 安装的环境变量不是这个目录,是MSYS2 里面的目录
C:\mingw-w64\mingw64\bin
配置go的编译环境文件如win64位的
##########开始
# native compiler windows amd64
GOROOT=c:\Go
#GOBIN=
GOARCH=amd64
GOOS=windows
CGO_ENABLED=1
CC=C:\mingw64\bin\gcc.exe
CXX=C:\mingw64\bin\g++.exe
PATH=c:\mingw64\bin;%GOROOT%\bin;%PATH%
LITEIDE_GDB=gdb64
LITEIDE_MAKE=mingw32-make
LITEIDE_TERM=%COMSPEC%
LITEIDE_TERMARGS=
LITEIDE_EXEC=%COMSPEC%
LITEIDE_EXECOPT=/C
##########结束
中文显示乱码解决方法:
在main包中init函数加入:
func init() {
//设置中文字体:解决中文乱码问题
fontPaths := findfont.List()
for _, path := range fontPaths {
if strings.Contains(path, "msyh.ttf") || strings.Contains(path, "simhei.ttf") || strings.Contains(path, "simsun.ttc") || strings.Contains(path, "simkai.ttf") {
os.Setenv("FYNE_FONT", path)
break
}
}
}
Windows下打包:
fyne package -os windows -icon app.jpg
三 参考文档
3.1 Fyne 官方帮助文档
安装
使用go install将可执行文件复制到您的 gobin目录中。要将带有图标等的应用程序安装到操作系统的标准应用程序位置,您可以使用 fyne 实用程序和“install”子命令。
go install fyne.io/fyne/v2/cmd/fyne@latest
fyne install
手机包装
要在移动设备上运行,必须打包应用程序。为此,我们可以使用 fyne 实用程序“package”子命令。您需要根据提示添加适当的参数,但基本命令如下所示。打包后,您可以使用平台开发工具或 fyne“install”子命令进行安装。
fyne package -os android -appID my.domain.appname -icon mobileIcon.png
也可以
fyne package -os android/arm64 -appID my.domain.appname -icon mobileIcon.png
fyne install -os android
构建的 Android 应用程序可以在真实设备或 Android 模拟器中运行。但是,为 iOS 构建略有不同。如果“-os”参数为“ios”,则它仅适用于真实的 iOS 设备。将“-os”指定为“iossimulator”可让应用程序在 iOS 模拟器中运行:
fyne package -os ios -appID my.domain.appname -icon mobileIcon.png
fyne package -os iossimulator -appID my.domain.appname -icon mobileIcon.png
编译windows程序
fyne package -os windows -icon favicon.ico --name test.exe
准备发布
使用 fyne 实用程序“release”子命令,您可以打包您的应用以发布到应用商店和市场。确保您已安装标准构建工具,并已按照平台文档设置帐户和签名。然后您可以执行类似下面的操作,请注意该-os ios参数允许从 macOS 计算机构建 iOS 应用。其他组合也同样有效 :)
$ fyne release -os ios -certificate "Apple Distribution" -profile "My App Distribution" -appID "com.example.myapp"
上述命令将创建一个“.ipa”文件,然后可以将其上传到 iOS App Store。
walk UI程序
简单代码
package main
import (
"syscall"
"github.com/lxn/walk"
"github.com/lxn/win"
)
func main() {
window, _ := walk.NewMainWindow()
// 设置窗体标题
window.SetTitle(`你好世界!`)
// 设置窗体的宽高
window.SetWidth(400)
window.SetHeight(400)
// 设置窗体生成在屏幕的正中间
// 窗体横坐标 = ( 屏幕宽度 - 窗体宽度 ) / 2
// 窗体纵坐标 = ( 屏幕高度 - 窗体高度 ) / 2
window.SetX((int(win.GetSystemMetrics(0)) - window.Width()) / 2)
window.SetY((int(win.GetSystemMetrics(1)) - window.Height()) / 2)
// 设置窗体为显示状态(默认:隐藏状态)
window.Show()
// 运行窗体
window.Run()
}
// HelloWalkUI project main.go
package main
import (
"fmt"
"io"
"os"
"strings"
"github.com/lxn/walk"
. "github.com/lxn/walk/declarative"
)
type MyMainWindow struct {
*walk.MainWindow
edit *walk.TextEdit
}
func main() {
mw := &MyMainWindow{}
if err := (MainWindow{
AssignTo: &mw.MainWindow,
MinSize: Size{400, 300},
Size: Size{600, 400},
MenuItems: []MenuItem{
Menu{
Text: "文件",
Items: []MenuItem{
Action{
Text: "打开文件",
Shortcut: Shortcut{ //定义快捷键后会有响应提示显示
Modifiers: walk.ModControl,
Key: walk.KeyO,
},
OnTriggered: mw.openFileActionTriggered, //点击动作触发响应函数
},
Action{
Text: "另存为",
Shortcut: Shortcut{
Modifiers: walk.ModControl | walk.ModShift,
Key: walk.KeyS,
},
OnTriggered: mw.saveFileActionTriggered,
},
Action{
Text: "退出",
OnTriggered: func() {
mw.Close()
},
},
},
},
Menu{
Text: "帮助",
Items: []MenuItem{
Action{
Text: "关于",
OnTriggered: func() {
walk.MsgBox(mw, "关于", "这是一个菜单和工具栏的实例",
walk.MsgBoxIconInformation|walk.MsgBoxDefButton1)
},
},
},
},
},
ToolBar: ToolBar{ //工具栏
ButtonStyle: ToolBarButtonTextOnly,
Items: []MenuItem{
Menu{
Text: "New",
Items: []MenuItem{
Action{
Text: "A",
OnTriggered: mw.newAction_Triggered,
},
Action{
Text: "B",
OnTriggered: mw.newAction_Triggered,
},
},
OnTriggered: mw.newAction_Triggered, //在菜单中不可如此定义,会无响应
},
Separator{}, //分隔符
Action{
Text: "View",
OnTriggered: mw.changeViewAction_Triggered,
},
},
},
Layout: VBox{},
Children: []Widget{
TextEdit{
AssignTo: &mw.edit,
},
},
OnDropFiles: mw.dropFiles, //放置文件事件响应函数
}).Create(); err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
mw.Run()
}
func (mw *MyMainWindow) openFileActionTriggered() {
dlg := new(walk.FileDialog)
dlg.Title = "打开文件"
dlg.Filter = "文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*"
if ok, err := dlg.ShowOpen(mw); err != nil {
fmt.Fprintln(os.Stderr, "错误:打开文件时\r\n")
return
} else if !ok {
fmt.Fprintln(os.Stderr, "用户取消\r\n")
return
}
s := fmt.Sprintf("选择了:%s\r\n", dlg.FilePath)
mw.edit.SetText(s)
}
func (mw *MyMainWindow) saveFileActionTriggered() {
dlg := new(walk.FileDialog)
dlg.Title = "另存为"
if ok, err := dlg.ShowSave(mw); err != nil {
fmt.Fprintln(os.Stderr, err)
return
} else if !ok {
fmt.Fprintln(os.Stderr, "取消")
return
}
data := mw.edit.Text()
filename := dlg.FilePath
f, err := os.Open(filename)
if err != nil {
f, _ = os.Create(filename)
} else {
f.Close()
f, err = os.OpenFile(filename, os.O_WRONLY, 0x666)
}
if len(data) == 0 {
f.Close()
return
}
io.Copy(f, strings.NewReader(data))
f.Close()
}
func (mw *MyMainWindow) newAction_Triggered() {
walk.MsgBox(mw, "New", "Newing something up... or not.", walk.MsgBoxIconInformation)
}
func (mw *MyMainWindow) changeViewAction_Triggered() {
walk.MsgBox(mw, "Change View", "By now you may have guessed it. Nothing changed.", walk.MsgBoxIconInformation)
}
func (mw *MyMainWindow) dropFiles(files []string) {
mw.edit.SetText("")
for _, v := range files {
mw.edit.AppendText(v + "\r\n")
}
}
需要同名exe文件加个.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>
使用 Go 和 Web 技术构建桌面应用程序
点击访问,为 Go 程序提供 Web 界面的传统方法是通过内置 Web 服务器。Wails 提供了一种不同的方法:它提供了将 Go 代码和 Web 前端一起打包成单个二进制文件的能力。通过提供的工具,可以很轻松的完成项目的创建、编译和打包。你所要做的就是发挥创造力!
上一篇:Go优秀的开源库及软件项目
下一篇:Go开发wasm资料收集