28
go开发 windows GUI界面
source link: https://studygolang.com/articles/30779
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
一、环境配置
1、使用go modules新建 一个工程。
2、开始写一个简单的GUI测试程序,新建main.go写入代码。
3、执行 >> go build -ldflags="-H windowsgui"
下载依赖,并生成可执行文件。(此处生成的文件还无法执行)
4、在工程下新建一个 test.minifest文件,内容如下:
<?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>
5、还需要一个golang包: go get github.com/akavel/rsrc
到该包下执行go build. 生成 rsrc.exe文件。
该包用于在程序中嵌入二进制资源的工具
将文件复制到GOROOT/bin 下面 。
再回到代码目录执行>> rsrc -manifest test.manifest -o rsrc.syso
6、通过上述配置后再执行: >> go build -ldflags="-H windowsgui"
生成main.exe可执文件,运行结果如下:
image.png
package main import ( "fmt" "log" "os" "strings" ) import ( "github.com/lxn/walk" . "github.com/lxn/walk/declarative" ) func main() { mw := &MyMainWindow{model: NewEnvModel()} if _, err := (MainWindow{ AssignTo: &mw.MainWindow, Title: "Walk ListBox Example", MinSize: Size{240, 320}, Size: Size{300, 400}, Layout: VBox{MarginsZero: true}, Children: []Widget{ HSplitter{ Children: []Widget{ ListBox{ AssignTo: &mw.lb, Model: mw.model, OnCurrentIndexChanged: mw.lb_CurrentIndexChanged, OnItemActivated: mw.lb_ItemActivated, }, TextEdit{ AssignTo: &mw.te, ReadOnly: true, }, }, }, }, }.Run()); err != nil { log.Fatal(err) } } type MyMainWindow struct { *walk.MainWindow model *EnvModel lb *walk.ListBox te *walk.TextEdit } func (mw *MyMainWindow) lb_CurrentIndexChanged() { i := mw.lb.CurrentIndex() item := &mw.model.items[i] mw.te.SetText(item.value) fmt.Println("CurrentIndex: ", i) fmt.Println("CurrentEnvVarName: ", item.name) } func (mw *MyMainWindow) lb_ItemActivated() { value := mw.model.items[mw.lb.CurrentIndex()].value walk.MsgBox(mw, "Value", value, walk.MsgBoxIconInformation) } type EnvItem struct { name string value string } type EnvModel struct { walk.ListModelBase items []EnvItem } func NewEnvModel() *EnvModel { env := os.Environ() m := &EnvModel{items: make([]EnvItem, len(env))} for i, e := range env { j := strings.Index(e, "=") if j == 0 { continue } name := e[0:j] value := strings.Replace(e[j+1:], ";", "\r\n", -1) m.items[i] = EnvItem{name, value} } return m } func (m *EnvModel) ItemCount() int { return len(m.items) } func (m *EnvModel) Value(index int) interface{} { return m.items[index].name }
有疑问加站长微信联系
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK