golang开发GUI桌面应用(一)

基础操作

requires:Go 1.11.x or later

安装依赖

go get github.com/lxn/walk
go get github.com/akavel/rsrc
rsrc

创建文件 go-gui/gui.go

package mainimport ("strings""github.com/lxn/walk". "github.com/lxn/walk/declarative"
)func main() {var inTE, outTE *walk.TextEditMainWindow{Title: "xiaochuan测试",MinSize: Size{600, 400},Layout: VBox{},Children: []Widget{HSplitter{Children: []Widget{TextEdit{AssignTo: &inTE, MaxLength: 10},TextEdit{AssignTo: &outTE, ReadOnly: true},},},PushButton{Text: "SCREAM",OnClicked: func() {outTE.SetText(strings.ToUpper(inTE.Text()))},},},}.Run()
}
go mod init go-gui

创建后缀为manifest的文件 go-gui/go-gui.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>
rsrc -manifest go-gui.exe.manifest -o rsrc.syso
go build -ldflags="-H windowsgui"

双击 go-gui.exe

文件go-gui.exe可以复制到任何地方直接运行,因为已经将manifest文件编译进去了。

添加图标

rsrc -manifest go-gui.exe.manifest -ico favicon.ico -o rsrc.syso
go build -ldflags="-H windowsgui"

favicon.ico为下载的图标文件,效果如下。


运行程序,任务栏上的图标也变成了这个。

具体说明

1、manifest 文件

这个东西的作用就是为了解决 以前windows上的“Dll 地狱” 问题才产生的新的DLL管理解决方案。大家知道,Dll是动态加载共享库,同一个Dll可能被多个程序所使用,而所谓“Dll 地狱”就是当不通程序依赖的Dll相同,但版本不同时,由于系统不能分辨到底哪个是哪个,所以加载错了Dll版本,然后就挂了。于是盖茨就吸取了教训,搞了一个程序集清单的东西,每个程序都要有一个清单,这个清单存再和自己应用程序同名的.manifest文件中,里面列出其所需要的所有依赖,这儿所列出的依赖可不是简单地靠文件明来区分的,而是根据一种叫做“强文件名”的东西区分的。。。。。。

2、rsrc程序的作用
rsrc - Tool for embedding binary resources in Go programs.Generates a .syso file with specified resources embedded in .rsrc section,aimed for consumption by Go linker when building Win32 excecutables.The generated *.syso files should get automatically recognized by 'go build'
command and linked into an executable/library, as long as there are any *.go
files in the same directory.OPTIONS:-arch stringarchitecture of output file - one of: 386, amd64, [EXPERIMENTAL: arm, arm64] (default "amd64")-ico stringcomma-separated list of paths to .ico files to embed-manifest stringpath to a Windows manifest file to embed-o stringname of output COFF (.res or .syso) file; if set to empty, will default to 'rsrc_windows_{arch}.syso'

rsrc将静态资源文件编译到syso文件中,go语言在最新版本中已经支持syso文件的链接并且会搜索当前目录,自动链接。

在Go1.16起引入了embed包,也可以实现将静态文件编译进去。参考:https://www.php.cn/be/go/484192.html

本机安装的是Go1.14,没有办法演示使用 embed 的方式加载 manifest 文件。

当然,我们也可以不将 manifest文件编译进去,比如,我的目录下只有gui.gogo-gui.exe.manifest文件,然后使用go build -ldflags="-H windowsgui"来编译。得到go-gui.exe,注意,此时的manifest文件名一定要是go-gui.exe.manifest。点击go-gui.exe,效果一样,只是,go-gui.exego-gui.exe.manifest要在同一个目录下。

3、参数-ldflags="-H windowsgui"的意义

正常情况下,任何语言开发的GUI都会伴随着一个CMD框在后面,比如这样

是的,如果仅仅使用go build来编译的话,就是这个效果,带上参数-ldflags="-H windowsgui"就会去掉后面的CMD框。

这个CMD框的作用是打印信息,输出等。

另外,还可以压缩一下生成的程序的大小:-ldflags="-H windowsgui -w"

关于 golang GUI

win
win把win32 api几乎所有相关的声明都导成了go。如果发现有没导出的,可以参照里面的方法导出,很简单的。

walk
是对win包的再次封装,方便使用。

fyne
文档相对丰富一些。

govcl

golang开发GUI桌面应用walk(一)相关推荐

  1. golang开发GUI桌面应用fyne(二)

    之前写过一篇使用 walk 包开发GUI,但是使用过程中发现walk封装的不是很好,虽然功能也很丰富,但是使用起来发现不太符合我的调用习惯,于是转而参考下 fyne 库. 源码:https://git ...

  2. golang开发GUI桌面应用fyne(三)

    文档 https://developer.fyne.io/started/packaging 画布 Canvas 在 Fyne 中,我们向窗体设置内容的方法 window.SetContent(Can ...

  3. go html桌面,Go语言:开发GUI桌面应用(andlabs/ui)

    我的建议(2019-9-29): 我不是很提倡使用这个GUI库了(原因:功能缺陷严重) 因为我发现了一个 功能强大基本上没有缺陷 的GUI库(lxn/walk) 重点:它以 Win32 API 做的, ...

  4. Go实战--使用golang开发Windows Gui桌面程序(lxn/walk)

    生命不止,继续 go go go!!! golang官方并没有提供Windows gui库,但是今天还是要跟大家分享一下使用golang开发Windows桌面程序,当然又是面向github编程了. 知 ...

  5. Golang的GUI探讨:不要在一棵树上吊死,要在多棵树上

    原文: Golang的GUI探讨:不要在一棵树上吊死,要在多棵树上 • 腾图工作室,威远博客,威远工作室,Ease 关于Golang开发GUI界面始终是一个问题,似乎没有大家公认比较好的简单方法. 我 ...

  6. 用Java开发桌面应用程序(Swing开发GUI程序)

    前面学过了面向对象基本概念.面向对象基本特征.Java基本包和API:异常.多线程.IO等. 基本概念 Swing:java中的一个包,负责开发GUI程序 GUI:图形用户界面,一般指可视化桌面系统中 ...

  7. go开发gui还是python开发gui_golang为什么没有官方的gui包?

    更新:我从2014年底开始使用 andlabs/ui · GitHub 开发GUI 程序.这个库支持多个操作系统,包括 Linux 和 MacOSX.而且 API 和程序结构充分使用了 Go 的特色语 ...

  8. Webview 将浏览器作为golang的GUI

    1.Golang的跨平台WebVIEW小库.使用WebKit(Gtk/Cocoa)和Edge(Windows) 将浏览器作为golang的GUI界面使用,外面可套层壳,也可直接控制.这解决了golan ...

  9. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者 http://www.admin10000.com/document/9 ...

最新文章

  1. OC高效率52之理解消息转发机制
  2. 个人博客开通--纪念一下。。。
  3. 避免后台脚本重复启动机制
  4. js字符串的操作方法
  5. JUC系列(八)| 读写锁-ReadWriteLock
  6. BIND_MISMATCH导致过多VERSION COUNT的问题
  7. centos7 ModuleNotFoundError: No module named 'users'
  8. 一种伪随机交织器的生成方法
  9. teechart mysql_TeeChart 的应用
  10. .Net Micro Framework导航总贴(新手必看)
  11. accept 阻塞_TCP网络编程中connect()、listen()和accept()三者之间的关系
  12. JavaScript数组中新增元素(2)
  13. PHP for循环时模拟计算进度
  14. 自制1寸照片及打印排版
  15. WEB2.0是什么东东?[转]
  16. 见微知著:语义分割中的弱监督学习
  17. 加速计.陀螺仪的使用
  18. 通过Web Service实现IP地址查询功能
  19. spark使用之ALS版本对比
  20. 微信开发者工具首次登陆提示网络连接失败

热门文章

  1. Android拖拽、回弹布局
  2. 我在github上读清华北大|浙大计算机课程共享项目
  3. esp32cam通过无线局域网进行图像传输
  4. java宠物小精灵_简单的Java宠物小精灵战斗模拟器
  5. Windows10 内存占用大,掉不下来,释放工具
  6. IDEA下载以及一些基本配置
  7. device-mapper 块级重删(dm dedup) 1 序
  8. 戳Web3的神话?戳到铁板。
  9. 单引号双引号 linux 的区别
  10. 英文版计算机书籍在哪买得到,计算机英文原版