Go-GTK 信号处理

信号处理

简介

如今咱们已经把按钮添加到窗口中了,可是有一个问题:点击按钮没有反应。咱们既然添加的是按钮,确定但愿当咱们点击一个按钮时,可以作一些事情,这就用到了信号处理。git

学习图形界面编程,咱们会常常接触到“信号”这个名词。GTK中的“信号”其实是一种软件中断。“中断”在咱们生活中常常遇到,譬如,我正在房间里打游戏,忽然送快递的来了,把正在玩游戏的我给“中断”了,我去签收快递( 处理中断 ),处理完成后,再继续玩个人游戏。GTK中的“信号”就是属于这么一种“中断”,当用户按下按钮的时候,就产生一个“中断”,至关于产生一个信号,接着就会处理这么一个“中断任务”(程序里体验为调用一个函数)。github

按钮中经常使用的信号:编程

信号标识 触发条件
"clicked" 按下按钮且松开鼠标时触发(鼠标必须在按钮范围中)
"pressed" 按下按钮时(尚未松开鼠标)触发
"released" 释放按钮时(不管在哪松开鼠标)触发

信号注册

对于程序而言,咱们按下按钮,其实就是调用一个函数来对信号进行处理。假若有函数A, B, C,咱们如何肯定按下按钮后只调用函数A,而不是函数 B 或 C。这时候,咱们须要一种规则规定,按下按钮后就调用函数A。函数

咱们经过控件的Connect()方法来处理对应的信号。布局

Connect() 方法说明:学习

func (v *Widget) Connect(s string, f interface{}, datas ...interface{}) int
功能:信号注册
参数:
  - v:信号发出者。能够认为咱们操做的控件,如按下按钮,这个就是按钮指针
  - s:信号标志,如:"clicked"
  - f:回调函数的名称
  - datas:给回调函数传的参数。尽管是可变参数,可是只能传递一个参数,可变参数的目的是为了让用户多个选择(能够传参,或者不传)
返回值:注册函数的标志

示例程序

下面经过代码实现一个按钮的 clicked 信号,其它两个请自行测试效果。测试

package main

import (
	"fmt"
	"github.com/mattn/go-gtk/glib"
	"github.com/mattn/go-gtk/gtk"
	"os"
)

func main(){
	//GTK初始化操做
	gtk.Init(&os.Args)

	// 经过GTK建立窗口
	win := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)

	// 设置窗体的大小
	win.SetSizeRequest(640, 480)

	// 设置窗体标题
	win.SetTitle("GTK窗口")

	// 建立按钮
	b := gtk.NewButton()
	// 设置按钮大小
	b.SetSizeRequest(80, 32)
	// 设置按钮内容
	b.SetLabel("点击")

	// 设置按钮点击事件
	b.Connect("clicked", BtnClick, "点我干吗~")

	// 建立布局
	layout := gtk.NewFixed()
	// 将按钮 b 添加到布局中
	layout.Add(b)

	// 放在布局的指定位置
	layout.Put(b, 0, 0)
	// 移动按钮的位置,必须先Put(),再用Move()
	layout.Move(b, 280, 224)

	// 将布局放在界面中显示
	win.Add(layout)

	// 将界面显示
	win.ShowAll()

	// 调用GTK下的main运行程序
	gtk.Main()
}

// 按钮 b 信号处理的回调函数
func BtnClick(ctx *glib.CallbackContext){
	// 获取用户传递的参数,空接口类型
	arg := ctx.Data()
	// 对数据进行类型断言
	data, ok := arg.(string)
	// 若是 ok == true,说明类型断言正确
	if ok{
		fmt.Println(data)
	}
}

或者能够经过匿名函数来实现:网站

package main

import (
	"fmt"
	"github.com/mattn/go-gtk/glib"
	"github.com/mattn/go-gtk/gtk"
	"os"
)

func main(){
	//GTK初始化操做
	gtk.Init(&os.Args)

	// 经过GTK建立窗口
	win := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)

	// 设置窗体的大小
	win.SetSizeRequest(640, 480)

	// 设置窗体标题
	win.SetTitle("GTK窗口")

	// 建立按钮
	b := gtk.NewButton()
	// 设置按钮大小
	b.SetSizeRequest(80, 32)
	// 设置按钮内容
	b.SetLabel("点击")

	// 设置按钮点击事件
	// b.Connect("clicked", BtnClick, "点我干吗~")

	// 使用匿名函数实现按钮点击事件处理
	b.Connect("clicked", func(ctx *glib.CallbackContext){
		// 获取用户传递的参数,空接口类型
		arg := ctx.Data()
		// 对数据进行类型断言
		data, ok := arg.(string)
		// 若是 ok == true,说明类型断言正确
		if ok{
			fmt.Println(data)
		}
	}, "点我干吗~")

	// 建立布局
	layout := gtk.NewFixed()
	// 将按钮 b 添加到布局中
	layout.Add(b)

	// 放在布局的指定位置
	layout.Put(b, 0, 0)
	// 移动按钮的位置,必须先Put(),再用Move()
	layout.Move(b, 280, 224)

	// 将布局放在界面中显示
	win.Add(layout)

	// 将界面显示
	win.ShowAll()

	// 调用GTK下的main运行程序
	gtk.Main()
}

运行结果:指针

运行结果

李培冠博客

欢迎访问个人我的网站:code

李培冠博客:lpgit.com

相关文章
相关标签/搜索