感觉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)