(摘) Golang之GUI: gotk3 续一

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

感觉gotk3功能较为丰富,且暂时没有发现已知的问题(中文显示及输入),于是继续深入学习一下。


按钮--------------------------------------------------------------

button1.SetSensitive(false)   //按钮变灰色,不能按

font := pango.FontDescriptionFromString("Sans")
font.SetSize(30 * pango.SCALE)
font.Free()
fmt.Println("button1", reflect.TypeOf(button1.Widget))
font.GetWeight()
font.SetWeight(button1.wid)

//获取按钮2的大小
w, h := button2.GetSizeRequest()
fmt.Println(w, h)

// 设置图标
//创建pixbuf
//pixbuf, err := gdk.PixbufNewFromFile("images/icons8-youtube.png")
pixbuf, err := gdk.PixbufNewFromFileAtScale("images/icons8-youtube.png", w-10, h-10, false)
if err != nil {
	log.Fatal(err)
}
//通过pixbuf新建image
image, _ := gtk.ImageNewFromPixbuf(pixbuf)
//释放pixbuf资源
pixbuf.Unref()
//按钮设置image
button2.SetImage(image)
// 取消焦距
button2.SetCanFocus(false)

//按钮信号处理
_, _ = button2.Connect("clicked", func() {
	fmt.Println("按钮2被按下")
})

行编辑 ----------------------------------------------

entry2.SetEditable(false)  //只读,不可编辑
entry2.SetSensitive(false) //变灰色,不能编辑

entry3.SetVisibility(false) //设置不可见字符,即密码模式

//信号处理,当用户在文本输入控件内部按回车键时引发activate信号
_, _ = entry1.Connect("activate", func() {
	entry1Text, _ := entry1.GetText()
	fmt.Println("entry text = ", entry1Text) //获取内容
})

水平布局-------------------------------------------------

//获取hbox控件
hboxObj, err := builder.GetObject("box2")
if err != nil {
	log.Fatal(err)
}
fmt.Println("hboxObj", reflect.TypeOf(hboxObj))

hbox := hboxObj.(*gtk.Box)
//gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 3)
button, _ := gtk.ButtonNewWithLabel("新按钮") //新建按钮
hbox.Add(button)                           //按钮添加到布局中

垂直布局----------------------------------------------------------

//获取vbox控件
vboxObj, err := builder.GetObject("box1")
if err != nil {
	log.Fatal(err)
}
fmt.Println("vboxObj", reflect.TypeOf(vboxObj))

vbox := vboxObj.(*gtk.Box)
//gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 3)
button, _ := gtk.ButtonNewWithLabel("新按钮") //新建按钮
vbox.Add(button)                           //按钮添加到布局中

grid布局------------------------------------------------------------

tableObj, err := builder.GetObject("grid1")
if err != nil {
	log.Fatal(err)
}
fmt.Println("tableObj", reflect.TypeOf(tableObj))
table := tableObj.(*gtk.Grid)

button, _ := gtk.ButtonNewWithLabel("新按钮")  //新建按钮
table.Attach(button, 2, 3, 2, 3)//指定位置添加控件 - 失败

对话框--------------------------------------------------------

_, _ = button1.Connect("clicked", func() {
	//新建消息对话框,选择对话框
	dialog := gtk.MessageDialogNew(
		window, //指定父窗口
		gtk.DIALOG_MODAL,              //模态对话框
		gtk.MESSAGE_QUESTION,          //指定对话框类型
		gtk.BUTTONS_YES_NO,            //默认按钮
		"Are u ok?") //设置内容

	dialog.SetTitle("问题对话框") //对话框设置标题

	flag := dialog.Run() //运行对话框
	if flag == gtk.RESPONSE_YES {
		fmt.Println("按下yes")
	} else if flag == gtk.RESPONSE_NO {
		fmt.Println("按下no")
	} else {
		fmt.Println("按下关闭按钮")
	}

	dialog.Destroy() //销毁对话框
})

_, _ = button2.Connect("clicked", func() {
	dialog := gtk.MessageDialogNew(
		window,           //指定父窗口
		gtk.DIALOG_MODAL, //模态对话框
		gtk.MESSAGE_INFO, //info类型
		gtk.BUTTONS_OK,   //默认按钮
		"结束了") //设置内容

	dialog.Run()     //运行对话框
	dialog.Destroy() //销毁对话框
})

定时器--------------------------------------------------------------

//启动定时器, 500毫秒为时间间隔,回调函数为匿名函数
//定时器id
id, _ := glib.TimeoutAdd(500, func() bool {
	num++
	label.SetText(strconv.Itoa(num)) //给标签设置内容
	if flag {
		return true                      //只要定时器没有停止,时间到自动调用回调函数
	}else {
		return false
	}
})
fmt.Println("id", reflect.TypeOf(id), id)

窗口-----------------------------------------------------

//大小改变事件,改变窗口大小,自动触发此事件
_, _ = window.Connect("configure_event", func() {
	//获取窗口尺寸
	w, h := window.GetSize()
	fmt.Println(w, h)
})


window, _ := gtk.WindowNew(gtk.WINDOW_POPUP) //新建窗口,弹出类型,即为无边框窗口
application.AddWindow(window)

// 鼠标按下事件
window.SetEvents(int(gdk.BUTTON_PRESS_MASK | gdk.BUTTON1_MOTION_MASK))

//鼠标按下事件处理
_, _ = window.Connect("button-press-event", func(widget *gtk.Window, ctx *gdk.Event) {
	//获取鼠键按下属性结构体变量,系统内部的变量,不是用户传参变量
	event := *(*gdk.EventButton)(unsafe.Pointer(&ctx))
	//x, y = int(event.X()), int(event.Y())

	if event.Button() == 1 { //左键
		x, y = int(event.X()), int(event.Y()) //保存点击的起点坐标
	} else if event.Button() == 3 { //右键
		//右键,关闭窗口
		//gtk.MainQuit()
		application.Quit()
	}
})

//鼠标移动事件处理
_, _ = window.Connect("motion-notify-event", func(widget *gtk.Window, ctx *gdk.Event) {
	//获取鼠标移动属性结构体变量,系统内部的变量,不是用户传参变量
	event := *(*gdk.EventButton)(unsafe.Pointer(&ctx))
	//fmt.Println(x, int(event.XRoot())-x, y,int(event.YRoot())-y)
	window.Move(int(event.XRoot())-x, int(event.YRoot())-y)
})

键盘------------------------------------------------------

callbackFunc := func(widget *gtk.Window, ctx *gdk.Event) {
	event := *(*gdk.EventKey)(unsafe.Pointer(&ctx))

	fmt.Println(event.KeyVal())

	//event.Keyval:获取按下(释放)键盘键值,每个键值对于一个ASCII码
	key := event.KeyVal()
	if gdk.KEY_Up == key {
		fmt.Println("上")
	} else if gdk.KEY_Down == key {
		fmt.Println("下")
	} else if gdk.KEY_Left == key {
		fmt.Println("左")
	} else if gdk.KEY_Right == key {
		fmt.Println("右")
	}

	fmt.Println("key = ", event.KeyVal())
}

//键盘按下事件处理
window.Connect("key-press-event", callbackFunc)

鼠标------------------------------------------------------

//添加鼠标按下事件
//BUTTON_PRESS_MASK: 鼠标按下,触发信号"button-press-event"
//BUTTON_RELEASE_MASK:鼠标抬起,触发"button-release-event"
//鼠标移动都是触发"motion-notify-event"
//BUTTON_MOTION_MASK: 鼠标移动,按下任何键移动都可以
//BUTTON1_MOTION_MASK:鼠标移动,按住左键移动才触发
//BUTTON2_MOTION_MASK:鼠标移动,按住中间键移动才触发
//BUTTON3_MOTION_MASK:鼠标移动,按住右键移动才触发
//window.SetEvents(int(gdk.BUTTON_PRESS_MASK | gdk.BUTTON1_MOTION_MASK))

window.SetEvents(int(gdk.BUTTON_PRESS_MASK))

callbackFunc := func(widget *gtk.Window, ctx *gdk.Event) {
    //fmt.Println(ctx, *ctx, &ctx, unsafe.Pointer(ctx))
    event := *(*gdk.EventButton)(unsafe.Pointer(&ctx))
    //fmt.Println(reflect.TypeOf(ctx), reflect.TypeOf(event))
    //fmt.Println(gdk.BUTTON1_MOTION_MASK)

    //fmt.Println(event.Type())
    if event.Type() == 4 { //单击
        fmt.Printf("单击, ")
    } else if event.Type() == 5 { //双击
        fmt.Printf("双击, ")
    }

    //fmt.Println("button = ", event.Button(), event.ButtonVal())
    if event.Button() == 1 {
        fmt.Printf("左键, ")
    } else if event.Button() == 2 {
        fmt.Printf("中间键, ")
    } else if event.Button() == 3 {
        fmt.Printf("右键, ")
    }
    fmt.Println("坐标:", int(event.X()), int(event.Y()))

}

//鼠标按下事件处理
window.Connect("button-press-event", callbackFunc)

相关文章