go-gtk3开发之按钮控件
案例说明
添加按钮,设置按钮属性,按钮绑定事件。
demo.go
package main
import (
"fmt"
"github.com/gotk3/gotk3/gdk"
"github.com/gotk3/gotk3/glib"
"github.com/gotk3/gotk3/gtk"
"github.com/gotk3/gotk3/pango"
"log"
"os"
"reflect"
)
func main() {
const appId = "com.nayoso.example"
app, _ := gtk.ApplicationNew(appId, glib.APPLICATION_FLAGS_NONE)
_, err := app.Connect("activate", func() {
createWindow(app)
})
if err != nil {
log.Fatal(err)
}
app.Run(os.Args)
}
func createWindow(application *gtk.Application) {
// 从文件中创建Builder
builder, err := gtk.BuilderNewFromFile("9_按钮/builder.ui")
if err != nil {
log.Fatal(err)
}
// 获取window窗口
winObj, _ := builder.GetObject("window1")
window := winObj.(*gtk.Window)
application.AddWindow(window)
// window 窗口设置
window.SetSizeRequest(300, 240) //设置窗口大小
window.SetTitle("hello go") //设置标题
window.SetResizable(false) //设置不可伸缩
window.SetPosition(gtk.WIN_POS_CENTER) //设置居中显示
err = window.SetIconFromFile("images/app.ico") //设置icon
if err != nil {
log.Fatal(err)
}
// 获取按钮
buttonObj1, _ := builder.GetObject("button1")
buttonObj2, _ := builder.GetObject("button2")
button1 := buttonObj1.(*gtk.Button)
button2 := buttonObj2.(*gtk.Button)
button1.SetLabel("@_~") //按钮设置文本信息
button1Text, _ := button1.GetLabel()
fmt.Println("button1 txt = ", button1Text) //获取按钮内容
button1.SetSensitive(false) //按钮变灰色,不能按
button1.SetSizeRequest(100, 80)
// 设置字体-失败
font := pango.FontDescriptionFromString("Sans")
font.SetSize(30 * pango.SCALE)
font.Free()
//gtk_widget_modify_font(GTK_WIDGET(labelChild), font)
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被按下")
})
// 显示所有界面
window.ShowAll()
}
/*
信号标识 触发条件
“clicked” 按下按钮时触发
“pressed” 按下按钮时触发
“released” 释放按钮时触发
*/
builder.ui
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
<object class="GtkFixed" id="fixed1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="use_action_appearance">False</property>
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="x">47</property>
<property name="y">66</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="use_action_appearance">False</property>
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="x">276</property>
<property name="y">136</property>
</packing>
</child>
</object>
</child>
</object>
</interface>