go-gtk3开发之按钮控件(11)

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>

发布了94 篇原创文章 · 获赞 52 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/weixin_43968923/article/details/105001357
今日推荐