5.3 Go语言项目实战:walk常用控件

Amiee7 · · 3728 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

本篇文章IT兄弟连GO语言学院小美给读者们分享一下walk常用控件, 对GO语言感兴趣想要学习Golang开发技术的小伙伴就随小编来了解一下吧。 **认识几种常用控件** - 按钮 - 菜单 - 工具栏 - 界面布局 - 列表 - 显示图片 **导入依赖** ``` import ( "github.com/lxn/walk" . "github.com/lxn/walk/declarative" "os" "strings" "io/ioutil" "fmt" "log" ) ``` **定义全局数据** ``` // 全局应用的菜单项 var myAction *walk.Action //自定义的主窗口 var myWindow *MyMainWindow //自定义窗口 type MyMainWindow struct { *walk.MainWindow te *walk.TextEdit //listbox使用的数据 model *EnvModel //listbox控件 listBox *walk.ListBox } ``` **定义列表数据模型** ``` //环境变量条目数据模型 type EnvItem struct { //环境变量的名字和值 name string value string } //列表数据模型 type EnvModel struct { //继承ListModelBase 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 (mw *MyMainWindow) lb_CurrentIndexChanged() { i := mw.listBox.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.listBox.CurrentIndex()].value walk.MsgBox(mw, "Value", value, walk.MsgBoxIconInformation) } //列表的系统回调方法:获得listbox的数据长度 func (m *EnvModel) ItemCount() int { return len(m.items) } //列表的系统回调方法:根据序号获得数据 func (m *EnvModel) Value(index int) interface{} { return m.items[index].name } ``` **定义普通事件回调** ``` //显示消息窗口 func ShowMsgBox(title, msg string) int { return walk.MsgBox(myWindow, "天降惊喜", "你老婆跟人跑了!", walk.MsgBoxOK) } //一个普通的事件回调函数 func TiggerFunc() { ShowMsgBox("天降惊喜", "你老婆跟人跑了!") } ``` **主调函数** ``` func main() { defer func() { if err := recover(); err != nil { errMsg := fmt.Sprintf("%#v", err) ioutil.WriteFile("fuck.log", []byte(errMsg), 0644) } }() myWindow = &MyMainWindow{model: NewEnvModel()} if _, err := (MainWindow{ AssignTo: &myWindow.MainWindow, Title: "常用控件", //窗口菜单 MenuItems: []MenuItem{ //主菜单一 Menu{ Text: "川菜", //菜单项 Items: []MenuItem{ //菜单项一 Action{ AssignTo: &myAction, Text: "鱼香肉丝", //菜单图片 Image: "img/open.png", //快捷键 Shortcut: Shortcut{walk.ModControl, walk.KeyO}, OnTriggered: func() { ShowMsgBox("已下单", "我是菜单项") }, }, //分隔线 Separator{}, //菜单项二 Action{ //文本 Text: "水煮鱼", //响应函数 OnTriggered: func() { ShowMsgBox("已下单", "您要的菜马上就去买") }, }, }, }, //主菜单二 Menu{ Text: "粤菜", //菜单项 Items: []MenuItem{ //菜单项一 Action{ Text: "鱼香肉丝", //菜单图片 Image: "img/open.png", //快捷键 Shortcut: Shortcut{walk.ModControl, walk.KeyO}, OnTriggered: func() { ShowMsgBox("已下单", "我是菜单项") }, }, //分隔线 Separator{}, //菜单项二 Action{ //文本 Text: "水煮鱼", //响应函数 OnTriggered: func() { ShowMsgBox("已下单", "您要的菜马上就去买") }, }, }, }, }, //工具栏 ToolBar: ToolBar{ //按钮风格:图片在字的前面 ButtonStyle: ToolBarButtonImageBeforeText, //工具栏中的工具按钮 Items: []MenuItem{ //引用现成的Action ActionRef{&myAction}, Separator{}, //自带子菜单的工具按钮 Menu{ //工具按钮本身的图文和监听 Text: "工具按钮2", Image: "img/document-properties.png", OnTriggered: TiggerFunc, //附带一个子菜单 Items: []MenuItem{ Action{ Text: "X", OnTriggered: TiggerFunc, }, Action{ Text: "Y", OnTriggered: TiggerFunc, }, Action{ Text: "Z", OnTriggered: TiggerFunc, }, }, }, Separator{}, //普通工具按钮 Action{ Text: "工具按钮3", Image: "img/system-shutdown.png", OnTriggered: func() { ShowMsgBox("天降惊喜", "你老婆跟人跑了!") }, }, }, }, MinSize: Size{600, 400}, Layout: VBox{}, //控件们 Children: []Widget{ //水平局部 HSplitter{ MinSize: Size{600, 300}, Children: []Widget{ ListBox{ StretchFactor: 1, //赋值给myWindow.listBox AssignTo: &myWindow.listBox, //要显示的数据 Model: myWindow.model, //单击监听 OnCurrentIndexChanged: myWindow.lb_CurrentIndexChanged, //双击监听 OnItemActivated: myWindow.lb_ItemActivated, }, TextEdit{ StretchFactor: 1, AssignTo: &myWindow.te, ReadOnly: true, }, }, }, HSplitter{ MaxSize:Size{600,50}, Children: []Widget{ //图像 ImageView{ Background: SolidColorBrush{Color: walk.RGB(255, 191, 0)}, //图片文件位置 Image: "img/open.png", //和四周的边距 Margin: 5, //定义最大拉伸尺寸 MinSize: Size{50, 50}, //显示模式 Mode: ImageViewModeZoom, }, //按钮 PushButton{ StretchFactor:8, Text: "摸我有惊喜", OnClicked: func() { ShowMsgBox("天降惊喜", "你老婆跟人跑了!") }, }, }, }, }, }.Run()); err != nil { log.Fatal(err) } } ``` 想要了解更多关于GO语言开发方面内容的小伙伴, 请关注IT兄弟连官网、公众号:GO语言研习社, IT兄弟连教育平有专业的微软、谷歌讲师为您指导, 此外IT兄弟连老师精心推出的GO语言教程定能让你快速掌握GO语言从入门到精通开发实战技能。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3728 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传