GTK+是一个控件工具包。每个通过GTK+创建的用户界面由一些控件组成。

控件是层级式的,window控件是主容器,通过在window中添加按钮、下拉菜单、输入字段等其他控件构成用户界面。

如果是复杂的用户界面,推荐使用GtkBuilder(从XML UI描述文件创建界面)来代替手动编译用户界面。

你还可以使用可视化的界面编辑器,像Glade

GTK+是事件驱动的。这个工具包监听像点击按钮一样的事件并将其发送给你的应用。

为了使你初步了解如何使用GTK+,我们将创建一个Gtk应用。这个应用会创建一个200*200像素的空window

程序运行效果:

package main

import (
"github.com/gotk3/gotk3/glib"
"github.com/gotk3/gotk3/gtk"
"log"
"os"
) func main() {
const appId = "com.nayoso.example"
//每个gtk3程序都需要一步
app, err := gtk.ApplicationNew(appId, glib.APPLICATION_FLAGS_NONE) if err != nil {
log.Fatal("Could not create application.", err)
} //为activate事件绑定函数, activate会在程序启动时触发,也就是app.Run()时
app.Connect("activate", func() {
onActivate(app)
} ) app.Run(os.Args) //运行gtkApplication
} func onActivate(application *gtk.Application) {
appWindow, err := gtk.ApplicationWindowNew(application) //创建window控件 if err != nil {
log.Fatal("Could not create application window.", err)
}
//设置窗口属性
appWindow.SetTitle("Basic Application.")
appWindow.SetDefaultSize(400, 400)
//显示窗口
appWindow.Show()
}

gtk.ApplicationNew()接受两个参数一个是 应用标识,其一般使用你域名的倒序形式。另一个是GApplicationFlags,其为了满足你对应用的特定需求。通常就像实例代码一样写glib.APPLICATION_FLAGS_NONE就可以了。

好的,我们已经创建了第一个窗口。但这只是一个孤零零的窗口,什么都没有。

接下来我们就来显示一个按钮吧,并让其输出著名的Hello World 。

package main

import (
"fmt"
"github.com/gotk3/gotk3/glib"
"github.com/gotk3/gotk3/gtk"
"log"
"os"
) //这部分是相同的
func main() {
const appId = "com.nayoso.example"
app, err := gtk.ApplicationNew(appId, glib.APPLICATION_FLAGS_NONE) if err != nil {
log.Fatal("Could not create application.", err)
} app.Connect("activate", func() {
onActivate(app)
} ) app.Run(os.Args)
} //
func onActivate(application *gtk.Application) { appWindow, err := gtk.ApplicationWindowNew(application)
if err != nil {
log.Fatal("Could not create application window.", err)
}
appWindow.SetTitle("Basic Application.")
appWindow.SetDefaultSize(400, 400) buttonBox, err := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 2) //以水平布局创建一个容器, 第二个参数是其中控件的像素间隔
if err != nil {
log.Fatal(err)
}
appWindow.Add(buttonBox) //将布局添加到window中 button, err := gtk.ButtonNewWithLabel("Hello World") //创建一个按钮
if err != nil {
log.Fatal(err)
}
buttonBox.Add(button) //将按钮添加到box容器中 button.Connect("clicked", func() { //让我们为按钮点击添加一个函数,每次点击都会在命令行输出Hello World
fmt.Println("Hello World")
appWindow.Destroy() //摧毁窗口
}) appWindow.ShowAll() //与Show()不同在于,它会输出Window中的子控件。你可以修改,查看不同的效果
}

程序运行效果:



本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。转载请注明出处!

Golang Gtk+3教程:开始的更多相关文章

  1. Golang Gtk+3教程:GtkBuilder使用XML构建UI

    在这节我将介绍GtkBuilder,其使我们可以从一个描述界面的xml文件构建UI.而这个文件我们可以使用Glade生成,这会极大的方便我们编辑用户界面.这节我们会使用到这么一个XML文件,名字为Bu ...

  2. Golang Gtk+3教程:Grid布局

    在上个例子中我们使用了box布局,现在让我们来学习另一种布局--grid.其实这几种布局都大同小异,如果你看懂了上一个例子,想必使用grid也不是难事. 程序运行效果: package main im ...

  3. VScode安装golang插件详细教程

    可能是由于非科班自学编程,所以在安装插件的时候虽然参考了很多人写的教程,但是总安装不成功,在综合各位大牛的教程之后进行总结,并且亲自实践安装成功,希望能给初学编程的人一些帮助,如果有不对的地方还希望大 ...

  4. 准备写个Golang开发的教程

    进入golang的开发已经差不多两年了,最近打算写个Golang的教程.目的是让有开发基础,没接触过Golang的人能够愉快高效地写出Golang项目. 1 记得17年底时候,有个特别小的项目,准备试 ...

  5. Golang简单入门教程——函数进阶篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第八篇,我们来聊聊golang当中的函数. 我们在之前的时候已经介绍过了函数的基本用法,知道了怎么样设计或者是定义一 ...

  6. Golang简易入门教程——面向对象篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第9篇文章,我们一起来看看golang当中的面向对象的部分. 在现在高级语言当中,面向对象几乎是不可或缺也是一门语言 ...

  7. Gtk中的文本视图(GtkTexViewWidget)

    Gtk中的文本视图(GtkTexViewWidget) Gtk中的文本视图(GtkTexView Widget) 在本章的Gtk+程序设计教程中,我们将重点介绍 GtkTexView 构件. GtkT ...

  8. GTK+中的树状列表构件(GtkTreeView)

    GTK+中的树状列表构件(GtkTreeView) GTK+中的树状列表构件(GtkTreeView) 在本章的GTK+程序设计教程中,我们将向大家重点介绍非常常用也有点复杂的构件--GtkTreeV ...

  9. golang 重构博客统计服务

    欢迎关注楼主与他的小伙伴们的小站,每周分享一些技术文章,让我们在技术上一起成长------> 戳这里,欢迎光临小站 -_- 作为一个后端开发,在docker,etcd,k8s等新技术不断涌现的今 ...

随机推荐

  1. echarts 踩坑 : 为什么触摸柱状图的时后柱子不见了?原来是color的锅!

    今天发现一个奇怪的问题. 当我的鼠标触摸柱状图的时候,柱状图就消失了. 后来发现是颜色的设置有问题. color: ['rgba(68,238,224)', 'rgba(17,215,255)', ' ...

  2. css:实现文本两行或多行文本溢出显示省略号

    div{ display: -webkit-box; -webkit-box-orient: vertical; word-break: break-all; word-wrap: break-wor ...

  3. Makefile中自动生成头文件依赖

    为什么需要自动生成头文件依赖? 编译单个源文件时,需要获取文件中包含的头文件的信息,但是一般的Makefile不会在规则中明确写明文件依赖的头文件,所以单独修改头文件后,不会导致包含头文件的源文件重新 ...

  4. Springboot(一)springboot简介与入门程序

    一.springboot简介: 对spring框架盛行了多年的java方向开发人员来说,每个人java开发已经把spring框架当做开发中不可或缺的一部分. 之前传统的模式都是以application ...

  5. C踩坑纪实——(一)

    最近在项目过程中发现了几个c语言中没有注意到的小细节,成功入坑.下面记录的我遇到的问题,以及解决的方法,希望这个过程能给读者带来些许启发. 字符类型变量的溢出 首先来看下面这段代码,你认为会输出什么呢 ...

  6. ken桑带你读源码 之scrapy scrapy\extensions

    logstats.py 爬虫启动时 打印抓取网页数   item数 memdebug.py 爬虫结束 统计还被引用的内存 也就是说gc 回收不了的内存   memusage.py 监控爬虫 内存占用  ...

  7. c产生随机数(含时间种子)

    有时候我们需要程序产生一个随机数. 可以用rand() 但是其实这个随机数是伪随机数,它是一个周期很长的一个值而已. 所以我们可以加入一个随机数种子srand(),这个可以取以当前时间为基准的一个值. ...

  8. Servlet学习之Maven导入Servlet-api包与Tomcat冲突报500问题

    Maven导入Servlet-api包导致无法运行报500的问题 以下解决方式适用于跟我类似的配置环境,构建servlet程序后,启动Tomcat页面报"类com.tioxy.servlet ...

  9. PHP array_splice() 函数

    实例 从数组中移除元素,并用新元素取代它: <?php$a1=array("a"=>"red","b"=>"gr ...

  10. PHP similar_text() 函数

    实例 计算两个字符串的相似度并返回匹配字符的数目: <?php高佣联盟 www.cgewang.comecho similar_text("Hello World",&quo ...