go-gui-控件和信号
go-gui-控件和信号
控件
控件简介
控件是对数据和方法的封装。控件有自己的属性和方法。属性是指控件的特征。方法是指控件的一些简单而可见的功能。如按钮就是一个控件,这个按钮是方形的,里面有张图片,这是我们能看到外观属性,同时,这个按钮具备被人按下的功能。
GTK中控件主要分为两类:容器控件,非容器控件。
容器控件:它可以容纳别的控件,我们可以理解为盒子,盒子拿来装东西。容器控件又分为两类,一类只能容纳一个控件,如窗口,按钮;另一类能容纳多个控件,如布局控件。
非容器控件:它不可以容纳别的控件,如标签、行编辑。
package main
import (
"os"
"github.com/mattn/go-gtk/gtk"
)
func main() {
gtk.Init(&os.Args) //环境初始化
//--------------------------------------------------------
// 主窗口
//--------------------------------------------------------
window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL) //创建窗口
window.SetPosition(gtk.WIN_POS_CENTER) //设置窗口居中显示
window.SetTitle("GTK Go!") //设置标题
window.SetSizeRequest(300, 200) //设置窗口的宽度和高度
//--------------------------------------------------------
// GtkFixed
//--------------------------------------------------------
layout := gtk.NewFixed() //创建固定布局
//--------------------------------------------------------
// GtkButton
//--------------------------------------------------------
b1 := gtk.NewButton() //新建按钮
b1.SetLabel("^_@") //设置内容
//b1.SetSizeRequest(100, 50) //设置按钮大小
b2 := gtk.NewButtonWithLabel("@_~") //新建按钮,同时设置内容
b2.SetSizeRequest(100, 50) //设置按钮大小
//--------------------------------------------------------
// 添加布局、添加容器
//--------------------------------------------------------
window.Add(layout) //把布局添加到主窗口中
layout.Put(b1, 0, 0) //设置按钮在容器的位置
layout.Move(b1, 50, 50) //移动按钮的位置,必须先put,再用move
layout.Put(b2, 50, 100)
window.ShowAll() //显示所有的控件
gtk.Main() //主事件循环,等待用户操作
}
//func (v *Fixed) Put(w IWidget, x, y int)
//功能:固定布局容器添加控件
//参数:
// widget:要添加的控件
// x, y:控件摆放位置的起点坐标
信号
GTK采用了信号与回调函数来处理窗口外部传来的事件、消息或信号。当信号发生时,程序自动调用为信号连接(注册)的回调函数。
学习图形界面编程,我们会经常接触到“信号”这个名词。GTK中的“信号”实际上是一种软件中断。“中断”在我们生活中经常遇到,譬如,我正在房间里打游戏,突然送快递的来了,把正在玩游戏的我给“中断”了,我去签收快递( 处理中断 ),处理完成后,再继续玩我的游戏。GTK中的“信号”就是属于这么一种“中断”,当用户按下按钮的时候,就产生一个“中断”,相当于产生一个信号,接着就会处理这么一个“中断任务”(程序里体验为调用一个函数)。
“信号”在GTK中可以认为一种中断的标志,如按下按钮的标志为”pressed”,释放按钮的标志为”released”,这些标志就相当于 go 语言的关键字一样,我们使用的时候必须完全按照它的名字来写。需要注意的是,每个控件的信号标志不一定都一样,如按钮(GtkButton)里有”pressed”信号,窗口(GtkWindow)里就没这个信号,每个控件具体有哪个信号,应该查看帮助文档来确定。
信号标识 触发条件
“clicked” 按下按钮时触发
“pressed” 按下按钮时触发
“released” 释放按钮时触发
package main
import (
"fmt"
"os"
"github.com/mattn/go-gtk/glib"
"github.com/mattn/go-gtk/gtk"
)
//按钮b1信号处理的回调函数
func HandleButton(ctx *glib.CallbackContext) {
arg := ctx.Data() //获取用户传递的参数,是空接口类型
p, ok := arg.(*int) //类型断言
if ok { //如果ok为true,说明类型断言正确
fmt.Println("*p = ", *p) //用户传递传递的参数为&tmp,是一个变量的地址
*p = 250 //操作指针所指向的内存
}
fmt.Println("按钮b1被按下")
//gtk.MainQuit() //关闭gtk程序
}
func main() {
gtk.Init(&os.Args) //环境初始化
//--------------------------------------------------------
// 主窗口
//--------------------------------------------------------
window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL) //创建窗口
window.SetPosition(gtk.WIN_POS_CENTER) //设置窗口居中显示
window.SetTitle("GTK Go!") //设置标题
window.SetSizeRequest(300, 200) //设置窗口的宽度和高度
//--------------------------------------------------------
// GtkFixed
//--------------------------------------------------------
layout := gtk.NewFixed() //创建固定布局
//--------------------------------------------------------
// GtkButton
//--------------------------------------------------------
b1 := gtk.NewButton() //新建按钮
b1.SetLabel("^_@") //设置内容
//b1.SetSizeRequest(100, 50) //设置按钮大小
b2 := gtk.NewButtonWithLabel("@_~") //新建按钮,同时设置内容
b2.SetSizeRequest(100, 50) //设置按钮大小
//--------------------------------------------------------
// 添加布局、添加容器
//--------------------------------------------------------
window.Add(layout) //把布局添加到主窗口中
layout.Put(b1, 0, 0) //设置按钮在容器的位置
layout.Move(b1, 50, 50) //移动按钮的位置,必须先put,再用move
layout.Put(b2, 50, 100)
//--------------------------------------------------------
// 信号处理
//--------------------------------------------------------
//按钮按下自动触发"pressed",自动调用HandleButton, 同时将 &tmp 传递给HandleButton
tmp := 10
b1.Connect("pressed", HandleButton, &tmp)
//回调函数为匿名函数,推荐写法
//按钮按下自动触发"pressed",自动调用匿名函数,
b2.Connect("pressed", func() {
fmt.Println("b2被按下")
fmt.Println("tmp = ", tmp)
}) //注意:}和)在同一行
window.ShowAll() //显示所有的控件
gtk.Main() //主事件循环,等待用户操作
}
//func (v *Widget) Connect(s string, f interface{}, datas ...interface{}) int
//功能:信号注册
//参数:
// v: 信号发出者,可以认为我们操作的控件,如按下按钮,这个就为按钮指针
// s:信号标志,如"pressed"
// f:回调函数的名称,
// datas:给回调函数传的参数,尽管是可变参数,但是只能传递一个参数,可变参数的目的为了让用户多个选择(可以传参,或者不传)
//返回值:
// 注册函数的标志
glade的简单使用
package main
import (
"fmt"
"os"
"github.com/mattn/go-gtk/gtk"
)
func main() {
gtk.Init(&os.Args)
builder := gtk.NewBuilder() //新建builder
builder.AddFromFile("test.glade") //读取glade文件
// 获取窗口控件指针,注意"window1"要和glade里的标志名称匹配
window := gtk.WindowFromObject(builder.GetObject("window1"))
b1 := gtk.ButtonFromObject(builder.GetObject("123456")) //获取按钮1
b2 := gtk.ButtonFromObject(builder.GetObject("togglebutton1")) //获取按钮2
//信号处理
b1.Connect("clicked", func() {
//获取按钮内容
fmt.Println("button txt = ", b1.GetLabel())
})
b2.Connect("clicked", func() {
//获取按钮内容
fmt.Println("button txt = ", b2.GetLabel())
gtk.MainQuit() //关闭窗口
})
//按窗口关闭按钮,自动触发"destroy"信号
window.Connect("destroy", gtk.MainQuit)
window.ShowAll()
gtk.Main()
}
//可以简单分为两步:
//1)读取glade文件
//// 创建GtkBuilder对象,GtkBuilder在<gtk/gtk.h>声明
//GtkBuilder *builder = gtk_builder_new();
//// 读取test.glade文件的信息,保存在builder指针变量里
//gtk_builder_add_from_file(builder, "./test.glade", NULL);
//2)获取glade文件里的控件
//// 获取窗口控件指针,注意"window1" 要和glade里的标志名称匹配
//GtkWidget *window = GTK_WIDGET(gtk_builder_get_object (builder, "window1"));
go-gui-控件和信号的更多相关文章
- paip.gui控件tabs控件加载内容的原理以及easyui最佳实现
paip.gui控件tabs控件加载内容的原理以及easyui最佳实现 //////////////tabs控件的加载 同form窗体一样,俩个方式 两个方式:一个是url,简单的文本可以使用这个,不 ...
- paip.gui控件form窗体的原理实现以及easyui的新建以及编辑实现
paip.gui控件form窗体的原理实现以及easyui的新建以及编辑实现 //////新建 与编辑 var EditForm=new Form_easyui(); if(row) ...
- Unity3D入门之GUI基础以及常用GUI控件使用(2)
1.GUI基础 (1)GUI部分是每帧擦除重绘的,只应该在OnGUI中绘制GUI,按钮:GUILayout.Button(“Hello”); 只读标签:GUILayout.Label() (2)修改控 ...
- 从一点儿不会开始——Unity3D游戏开发学习(二) ——GUI控件之Button
一些废话 我在上一篇“一点儿不会”的系列随笔中说大概一周会发个2~3篇关于Unity的学习笔记.可这就两周过去了,我还停留在一篇的进度上,主要是这两周发生了一些事情导致我更新缓慢.其实截至目前为止,上 ...
- [原]Unity3D深入浅出 - GUI控件
Unity的GUI类提供了丰富的界面控件,通过组合这些控件,完成和用户交互的界面. Lable:绘制文本和图片 Box:绘制一个图形框 Button:绘制一个响应单击事件的按钮 RepeatButto ...
- Atitit.Gui控件and面板----数据库区-mssql 2008 权限 配置 报表查看成员
Atitit.Gui控件and面板----数据库区-mssql 2008 权限 配置 报表查看成员 1. 配置server连接权限 1 2. 配置数据库权限 1 3. 设置表格/视图安全性 2 1. ...
- Atitit.Gui控件and面板----web server区----- web服务器监控面板and控制台条目
Atitit.Gui控件and面板----web server区----- web服务器监控面板and控制台条目 1. Resin4.0.22 1 2. 查看http连接数::Summary>& ...
- Unity3D学习笔记(一)GUI控件的调用
GUI控件:1.在Start中初始化,在OnGUI中调整.2.公有变量才会出现在Inspector面板.3.GUI控件的初始化和处理在OnGUI内完成.4.JavaScript的中文为UTF-8编码可 ...
- Atitit gui控件定位解决方案
Atitit gui控件定位解决方案 1.1. 但是AUTOIT没有找图功能..可以请大侠们写一份这个UDF出来吗?1 1.2. ahk1 1.3. Java +opencv 模板匹配2 1.1. 但 ...
- atitit.Atitit. Gui控件and面板-----服务端控件 java struts的实现最佳实践
atitit.Atitit. Gui控件and面板-----服务端控件 java struts的实现最佳实践 1. 服务器控件的类别 1 1.1. 数据控件:该类控件可细分为两种类型:数据源控件和数 ...
随机推荐
- Java编程思想——第21章 并发
前言 对于某些问题,如果能够并行的执行程序中的多个部分,则回变得非常方便甚至必要,这些部分要么看起来是并发执行,要么是在多处理环境下同时执行.并行编辑可以使程序执行速度得到极大提高,或者为设计某些类型 ...
- 这十个Python常用库,学习Python的你必须要知道!
想知道Python取得如此巨大成功的原因吗?只要看看Python提供的大量库就知道了 包括原生库和第三方库.不过,有这么多Python库,有些库得不到应有的关注也就不足为奇了.此外,只在一个领域里的工 ...
- HTML 文件路径
文件路径描述了网站文件夹结构中某个文件的位置. 文件路径会在链接外部文件时被用到: 网页 图像 样式表 JavaScript 绝对文件路径 绝对文件路径是指向一个因特网文件的完整 URL: 实例 &l ...
- 【Unity】 关于Package Manager 无限加载的问题(Loading Packages),以及可能的解决办法(待补充。)
·版本:2019.1.8f 官方论坛对于此问题的讨论:地址>Package Manager 许多人都遇到了这个问题,但是无法定位问题出在哪里.官方技术人员提供了一个名为 Package Mana ...
- opencv-python 图像基础处理(三)
腐蚀操作 #腐蚀操作 import cv2 import numpy as np img=cv2.imread("d:/ke.png") kernel = np.ones((3,3 ...
- 微信小程序开发者工具构建npm提示没找到node_modules目录
一.官网给的文档写的不够充分,需要你充分理解npm的使用方法,才能明白的: 二.第一步:先在你电脑上安装npm 参考下面文章 https://www.cnblogs.com/zmdComeOn/p/1 ...
- axel 多线程下载工具
yum install axel-2.4-9.el7.x86_64 -y # 选项 --max-speed=x , -s x 最高速度x --num-connections=x , -n x 连接数x ...
- android binder 进程间通信机制3-Binder 对象生死
以下概述Binder通信过程中涉及到的四个对象:Binder本地对象.Binder实体对象.Binder引用对象.Binder代理对象的生死. 1.Binder通信的交互过程 1.Client 进程发 ...
- Python入门基础学习(面向对象)
Python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...
- 3天学会kettle -全网最全的kettle教程
从资源库开始,详细讲解了kettle的所有控件的用法,无论你是开发人员.运维人员还是测试人员. 通过此教程都可以很快速的掌握kettle,再加上笔者的实例,3天学会kettle的实战操作. 欢迎关注公 ...