您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Go语言

GO语言 GUI编程 | 怎样实现 page 页面?

时间:2020-08-11 13:28:03  来源:  作者:

大家知道什么GUI样式是page页吧,也有的叫Tab页,其实都是一排按钮一样的界面,来控制一个较大的显示区(子窗口)。

GO语言 GUI编程 | 怎样实现 page 页面?

page页面基本样式

这样的界面设计,可以方便地在多个子窗口之间切换。

图中Page1 和Page 2就是切换控制器的内部按钮。下面的显示区就是stack。stack可以包含多个子窗口,但一个时间只能显示一个子窗口内容,由stackswitcher来控制。

它们的对象层次体系如下:

GO语言 GUI编程 | 怎样实现 page 页面?

gtkstackswitcher直接继承自gtkbox


GO语言 GUI编程 | 怎样实现 page 页面?

gtkstack则继承自gtkcontainer

下面我们实现一个例子,来熟悉这种界面的基本用法:

先看结果图,这样脑海里就有一个图形,在看代码时比较方便理解:

GO语言 GUI编程 | 怎样实现 page 页面?

第一页 显示一个文本框子窗口


GO语言 GUI编程 | 怎样实现 page 页面?

第二页 显示一个 radio button group


GO语言 GUI编程 | 怎样实现 page 页面?

第三页 显示一个文本框子窗口

先看main()主函数:

func main() {
  gtk.Init(nil) // 初始化gtk
  win := setup_window(winTitle) // 创建主窗口
  box := newStackFull() // 创建工作区窗口
  win.Add(box) // 把工作区窗口加到主窗口
  win.ShowAll() // 主窗口会递归显示各个子窗口
  gtk.Main() // GTK主循环启动,一直到 MainQuit()
}

主函数就是程序框架,主要包含初始化,创建主窗口,创建工作区,把工作区和主窗口通过ADD关联起来,主窗口显示,进入主消息循环,直到App收到退出信号。这个和win32编程的窗口消息循环是一致的。如果不太理解,建议看下window系统编程。

主窗口的创建就非常简单明了:

func setup_window(title string) *gtk.Window {
win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL) //创建顶级窗口
win.SetTitle(title) //设置窗口标题
win.Connect("destroy", func() { //设置销毁函数,即关闭窗口
gtk.MainQuit()
})
win.SetDefaultSize(800, 600) //设置主窗口宽高像素
win.SetPosition(gtk.WIN_POS_CENTER) //设置窗口启动初始显示位置:居中
return win
}

主窗口的创建也很简单,创建window对象,设置属性,标题,映射销毁回调函数,设置窗口默认大小,设置默认显示在屏幕中的位置。

来看看创建工作区窗口

func newStackFull() gtk.IWidget {
  // 创建一个stack 和它的控制器 switcher
  stack, err := gtk.StackNew()
  sw, err := gtk.StackSwitcherNew()
  sw.SetStack(stack) //控制器有个setstack函数来绑定二者关系
  // 给stack创建3个pages
  boxText1 := newBoxText("Hello there!")
  boxRadio := newBoxRadio("choice 1", "choice 2", "choice 3", "choice 4")
  boxText2 := newBoxText("third page")
  stack.AddTitled(boxText1, "key1", "first page")
  stack.AddTitled(boxRadio, "key2", "second page")
  stack.AddTitled(boxText2, "key3", "third page")
  // 可把icons 给 switcher page (这个page title就作为tooltip显示)
  stack.ChildSetProperty(boxRadio, "icon-name", "list-add")//加号图标
  // stack里的数据要显示到一个可视化组件里,这里创建一个box组件
  box := setup_box(gtk.ORIENTATION_VERTICAL) //垂直方向放置内部组件
  box.PackStart(sw, false, false, 0) //首先把控制器加到box,不展开,不填充全部空间,前面(因为是垂直故上面)不留空隙
  box.PackStart(stack, true, true, 0)//再把stack加到box,展开,填充,前面不留空==这样的结果就是stack占满了剩下的所有空间
  return box
}

创建stack窗口和windows编程几乎一样,就是window编程时,工作区是不需要自己创建的。而这里需要自己厂家一个box组件来作为工作区。而工作区窗口add到主窗口时显然按照“填充”剩余空间的方式显示的。

box中有一个开关组件,有一个stack组件。且box内部的组件按照垂直排列,开关先加入“不展开,不填充”,就会显示在最上面。stack后加入box,“展开且填充”即占满剩余空间。

代码中第二个page页面显示图标,其文本则作为帮助提示显示。这里还可以自定义图片。(以后完善项目再分享)

每个page也面对应文本框的,实际项目中也需要动态更新文本内容(以后分享如何改变内容)。

剩下的代码比较简单,直接上图,如下:

GO语言 GUI编程 | 怎样实现 page 页面?

newBoxText


GO语言 GUI编程 | 怎样实现 page 页面?

newBoxRadio


GO语言 GUI编程 | 怎样实现 page 页面?

其他细节代码

总结:

要活用page页界面,先了解各个组件之间的协作关系。用法其实比较简单的。你可以扩展成更复杂的界面。

今天刚看了《Hands-On-GUI-Application-Development-in-Go》这本书,虽然它用的gtk2版本和我安装的不一致,但它从GUI编程的整体历史出发,详细介绍了几个库,还是受益匪浅。


我是程序员黑洞,正在学习GoLang,基础学完后,准备分享一个工具软件的设计开发整个过程,代码开源到github或者gitee。欢迎关注我,可以留言私信。



Tags:GO语言   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
构建方式对比于其他语言的程序,Go语言的跨平台能力是真的强,拿.Net和JAVA来说吧,.Net在.Net core出现之前是不能跨平台的,只能在windows上编译运行,即使是.net core出现以后,跨平...【详细内容】
2022-06-23  Tags: GO语言  点击:(39)  评论:(0)  加入收藏
不使用三方库协程Sleep方式go func() { for true { fmt.Println("Hello !!") time.Sleep(1 * time.Second) }}()使用ticker方式1ticker := time.NewTic...【详细内容】
2022-02-25  Tags: GO语言  点击:(183)  评论:(0)  加入收藏
GO 语言爱好者的最佳Web框架如果你是自己写一个小应用程序,那你可能不需要Web框架。但是如果你要做产品,那么你肯定需要一个好的框架。如果你认为你有相应的知识和经验,你会自...【详细内容】
2022-02-01  Tags: GO语言  点击:(96)  评论:(0)  加入收藏
zip 是一种常见的归档格式,本文讲解 Go 如何操作 zip。首先看看 zip 文件是如何工作的。以一个小文件为例:(类 Unix 系统下)$ cat hello.textHello!执行 zip 命令进行归档:$ zip...【详细内容】
2021-12-17  Tags: GO语言  点击:(127)  评论:(0)  加入收藏
统一规范篇合理规划目录本篇主要描述了公司内部同事都必须遵守的一些开发规矩,如统一开发空间,既使用统一的开发工具来保证代码最后的格式的统一,开发中对文件和代码长度的控制...【详细内容】
2021-05-18  Tags: GO语言  点击:(294)  评论:(0)  加入收藏
闭包概述 闭包不是Go语言独有的概念,在很多编程语言中都有闭包 闭包就是解决局部变量不能被外部访问的一种解决方案 是把函数当作返回值的一种应用 代码演示总体思想:在函数...【详细内容】
2021-05-14  Tags: GO语言  点击:(281)  评论:(0)  加入收藏
一时想不开,想了解一下Go语言,于是安装了并体验了一下。下载1. 进入golang.google.cn 点击Download Go 2.选择对应的操作系统,点击后开始下载。 安装1. windows下执行傻瓜式安...【详细内容】
2021-05-12  Tags: GO语言  点击:(300)  评论:(0)  加入收藏
再次整理了一下这个日志收集系统的框,如下图 这次要实现的代码的整体逻辑为: 完整代码地址为: https://github.com/pythonsite/logagentetcd介绍高可用的分布式key-value存储,...【详细内容】
2021-01-14  Tags: GO语言  点击:(169)  评论:(0)  加入收藏
生命不止,继续 Go go go !!!之前关于golang操作数据库的博客:Go实战–go语言操作MySQL数据库(go-sql-driver/mysql)Go实战–go语言操作sqlite数据库(The way to go)...【详细内容】
2021-01-05  Tags: GO语言  点击:(398)  评论:(0)  加入收藏
欢迎访问我的GitHubhttps://github.com/zq2599/blog_demos内容:所有原创文章分类和汇总,及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;关于《gRPC学习》系列《gRPC学习》...【详细内容】
2020-12-14  Tags: GO语言  点击:(176)  评论:(0)  加入收藏
▌简易百科推荐
goshop开源项目的更新 备注:前面项目中用到的代码已经分享到GitHub中去了,并且以后所有项目中会出现的代码都会提交上去,欢迎查阅。感兴趣的可以点个star哦~gitee.com/jobhands...【详细内容】
2022-07-06  南方葵籽    Tags:Gorm   点击:(21)  评论:(0)  加入收藏
之前的一篇文章里,我提到了在VSCode和JetBrains之间反复横跳的事情,并且还觉得VSCode挺香的,Go、Python、Java等语言在VSCode中都可以获取到代码智能提示,不用死记硬背API了。没...【详细内容】
2022-06-29  BlackJ个啥    Tags:Go   点击:(70)  评论:(0)  加入收藏
构建方式对比于其他语言的程序,Go语言的跨平台能力是真的强,拿.Net和JAVA来说吧,.Net在.Net core出现之前是不能跨平台的,只能在windows上编译运行,即使是.net core出现以后,跨平...【详细内容】
2022-06-23  心有玲曦遇见你    Tags:Go语言   点击:(39)  评论:(0)  加入收藏
GO的全局变量很多从C++、C#等转过来做GO的初学小伙伴,都会发现同样一个疑问:就是GO中没有类似C++的静态变量。这就很纳闷了。有些配置数据,比如数据库的链接IP等,是需要全局共享...【详细内容】
2022-06-22  MEEGO    Tags:GO   点击:(60)  评论:(0)  加入收藏
Go 箴言 不要通过共享内存进行通信,通过通信共享内存 并发不是并行 管道用于协调;互斥量(锁)用于同步 接口越大,抽象就越弱 利用好零值 空接口 interface{} 没有任何类型约束 Gof...【详细内容】
2022-06-21  奇幻小鱼k    Tags:GO编程   点击:(39)  评论:(0)  加入收藏
协程(Goroutines)在Go语言中,每一个并发的执行单元叫作一个goroutine。,我们只需要通过 go 关键字来开启 goroutine 即可。goroutine 是轻量级线程,goroutine 的调度是由 Golang...【详细内容】
2022-06-20  VT漫步    Tags:go   点击:(27)  评论:(0)  加入收藏
golang基础语法Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 & 表达式 注释基本语法介绍...【详细内容】
2022-06-20  VT漫步    Tags:golang   点击:(14)  评论:(0)  加入收藏
开发环境IDE安装工欲善其事,必先利其器这里推荐两款golang开发工具,一个是goland,一个是VSCode;goland是收费的,收费还是有收费的道理,确实比较好用,个人比较推荐;VSCode需要安装插...【详细内容】
2022-06-15  VT漫步    Tags:golang   点击:(49)  评论:(0)  加入收藏
1. 函数传参 package mainimport "fmt"func main() { slice := []int{1, 2} fmt.Printf("data:%v, len:%d, cap:%d\n", slice, len(slice), cap(slice)) updateslice(slice)...【详细内容】
2022-06-08  顾明同学    Tags:golang   点击:(50)  评论:(0)  加入收藏
前几天有个同学想了解下如何在go-micro中做链路跟踪,这几天正好看到wrapper这块,wrapper这个东西在某些框架中也称为中间件,里边有个opentracing的插件,正好用来做链路追踪。ope...【详细内容】
2022-05-05  萤火架构    Tags:go-micro   点击:(61)  评论:(0)  加入收藏
站内最新
站内热门
站内头条