首页 > 其他分享 >桌面应用开发GOTK3 Glade (GO语言)

桌面应用开发GOTK3 Glade (GO语言)

时间:2024-02-02 11:48:21浏览次数:37  
标签:10 log err builder gtk Glade gotk3 GO GOTK3

目录

Github

git clone https://github.com/gotk3/gotk3.git

简介

  • gotk3 项目为 GTK 3 和依赖项目提供 Go 绑定。每个组件都有自己的子目录,用作包的导入路径。目前已实现对以下库的部分绑定支持:
    • GTK 3(3.12 及更高版本)
    • GDK 3(3.12 及更高版本)
    • GLib 2(2.36 及更高版本)

环境变量

vim ~/.bash_profile
# 添加 PKG_CONFIG_PATH
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/:`brew --prefix gtk+3`/lib/pkgconfig go get -u -v github.com/gotk3/gotk3/gdk:$PKG_CONFIG_PATH"
source ~/.bash_profile

官方示例

git clone https://github.com/gotk3/gotk3-examples.git
# 没有go.mod文件则需要初始化
go mod init example.com/glade
go mod tidy 
# gotk3依赖
# go get github.com/gotk3/gotk3/gtk
go run glade.go

demo.glade

Github

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
  <requires lib="gtk+" version="3.24"/>
  <object class="GtkWindow" id="window">
    <property name="width-request">400</property>
    <property name="height-request">200</property>
    <property name="can-focus">False</property>
    <property name="title" translatable="yes">demo</property>
    <child>
      <object class="GtkBox" id="box">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkButton" id="button">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can-focus">True</property>
            <property name="receives-default">True</property>
            <property name="margin-start">10</property>
            <property name="margin-end">10</property>
            <property name="margin-top">10</property>
            <property name="margin-bottom">10</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkComboBoxText" id="combobox">
            <property name="visible">True</property>
            <property name="can-focus">False</property>
            <property name="margin-start">10</property>
            <property name="margin-end">10</property>
            <property name="margin-top">10</property>
            <property name="margin-bottom">10</property>
            <property name="active">0</property>
            <property name="active-id">1</property>
            <items>
              <item id="1" translatable="yes">item1</item>
              <item id="2" translatable="yes">item2</item>
              <item id="3" translatable="yes">item3</item>
              <item id="4" translatable="yes">item4</item>
            </items>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkEntry" id="entry">
            <property name="visible">True</property>
            <property name="can-focus">True</property>
            <property name="margin-start">10</property>
            <property name="margin-end">10</property>
            <property name="margin-top">10</property>
            <property name="margin-bottom">10</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

main.go

package main

import (
	"github.com/gotk3/gotk3/gtk"
	"log"
)

func main() {
	gtk.Init(nil)
	builder, err := gtk.BuilderNewFromFile("ui/demo.glade")
	if err != nil {
		log.Fatal("Error loading Glade file:", err)
	}

	buildButton(builder)
	buildCombobox(builder)
	buildEntry(builder)
	window := buildWindow(builder)

	window.ShowAll()

	gtk.Main()
}

func buildWindow(builder *gtk.Builder) *gtk.Window {
	obj, err := builder.GetObject("window")
	if err != nil {
		log.Fatal("Error getting window object:", err)
	}
	window, ok := obj.(*gtk.Window)
	if !ok {
		log.Fatal("Error converting to gtk.Window")
	}
	window.Connect("destroy", func() {
		log.Println("Close Window")
		gtk.MainQuit()
	})
	return window
}

func buildButton(builder *gtk.Builder) {
	obj, err := builder.GetObject("button")
	if err != nil {
		log.Fatal("Error getting Button object:", err)
	}
	button, ok := obj.(*gtk.Button)
	if !ok {
		log.Fatal("Error converting to gtk.Button")
	}
	button.Connect("clicked", func() {
		log.Println("Hello World")
	})
}

func buildCombobox(builder *gtk.Builder) {
	obj, err := builder.GetObject("combobox")
	if err != nil {
		log.Fatal("Error getting ComboBoxText object:", err)
	}
	combobox, ok := obj.(*gtk.ComboBoxText)
	if !ok {
		log.Fatal("Error converting to gtk.ComboBoxText")
	}
	combobox.Connect("changed", func() {
		activeIndex := combobox.GetActive()
		activeText := combobox.GetActiveText()
		log.Println("ComboBoxText index item changed:", activeIndex, activeText)
	})
}

func buildEntry(builder *gtk.Builder) {
	obj, err := builder.GetObject("entry")
	if err != nil {
		log.Fatal("Error getting entry object:", err)
	}
	entry, ok := obj.(*gtk.Entry)
	if !ok {
		log.Fatal("Error converting to gtk.Entry")
	}
	entry.Connect("changed", func() {
		text, err := entry.GetText()
		if err != nil {
			log.Fatal("Error getting text from entry:", err)
		}
		log.Println("Entry text changed:", text)
	})
	entry.Connect("activate", func() {
		text, err := entry.GetText()
		if err != nil {
			log.Fatal("Error getting text from entry:", err)
		}
		log.Println("Entry text activated:", text)
	})
}

标签:10,log,err,builder,gtk,Glade,gotk3,GO,GOTK3
From: https://www.cnblogs.com/wufengsheng/p/18002875

相关文章

  • CF921 D. Good Trip
    题面代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineIOSios::sync_with_stdio(0);cin.tie(0);cout.tie(0);#definerep(i,a,n)for(inti=a;i<=n;i++)#defineper(i,a,n)for(inti=n;i>=a;i--)#definefirstfi#defineseconfse#defi......
  • 桌面应用开发GTK Glade (C语言)
    目录Github教程简介可视化设计生成XML描述文件与多种编程语言兼容与IDE集成安装Glade示例demo.gladedemo.cGithubhttps://github.com/GNOME/gtkhttps://github.com/GNOME/gladegitclonehttps://github.com/GNOME/glade.git教程https://developer.gnome.org/简介G......
  • Go语言精进之路读书笔记第12条——使用复合字面值作为初值构造器
    有些时候,零值并非最好的选择,我们有必要为变量赋予适当的初值以保证其后续以正确的状态参与业务流程计算,尤其是Go语言中的一些复合类型的变量。Go提供了复合字面值(compositeliteral)语法可以作为复合类型变量的初值构造器。Go语言中的复合类型包括结构体、数组/切片和map。Go提供......
  • Go语言精进之路读书笔记第11条——尽量定义零值可用的类型
    11.1Go类型的零值Go语言规范中关于变量默认值的描述:当通过声明或调用new为变量分配存储空间,或者通过复合文字字面量或调用make创建新值,且不提供显式初始化时,Go会为变量或值提供默认值。Go规范定义的内置原生类型的默认值(零值):所有整型类型:0浮点类型:0.0布尔类型:false字符......
  • 【Django开发】到1开发美多商城项目第3篇:用户注册业务实现(附代码,已分享)
    本系列文章md笔记(已分享)主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目(4.0版本)含代码和文档。功能包括前后端不分离,方便SEO。采用Django+Jinja2模板引擎+Vue.js实现前后端逻辑,Nginx服务器(反向代理)Nginx服务器(静态首页、商品详情页、uwsgi......
  • Go语言精进之路读书笔记第9条——使用无类型常量简化代码
    9.1Go常量溯源绝大多数情况下,Go常量在声明时并不显式指定类型,也就是说使用的是无类型常量(untypedconstant)。9.2有类型常量带来的烦恼如果有类型常量与变量的类型不同,那么混合运算的求值操作会报错:typemyIntintconstnmyInt=13//constmint=n+5//编译器错误提......
  • Go语言精进之路读书笔记第10条——使用iota实现枚举常量
    Go的const语法提供了隐式重复前一个非空表达式的机制const(Apple,Banan=11,22Straberry,GrapePear,Watermelon)//等价于const(Apple,Banan=11,22Straberry,Grape=11,22Pear,Watermelon=11,22)iota是Go语言的一个预定义......
  • Go语言精进之路读书笔记第8条——使用一致的变量声明形式
    Go语言常见的变量声明形式varaint32varsstring="hello"vari=13n:=17var(crlf=[]byte("\r\n")colonSpace=[]byte(":"))8.1包级变量的声明形式1.声明并同时显式初始化//Go编译器会自动根据等号右侧的InitExpression表达式求值的类型确定左侧......
  • RunnerGo低代码测试体验
    RunnerGo是基于go语言自研的一款企业级全栈式测试平台,采用Apache-2.0license开源协议,涵盖接口测试、性能测试、UI测试和项目管理等功能,并独创“拖拉拽”的方式快速编排真实测试场景的功能,加速产品交付周期、保证产品交付质量,为企业测试团队和产研团队提供一站式解决方案,是目前市......
  • MongoDB由浅入深(查询)
    //基础查询db.orderSlic.find();//根据ID查询db.orderSlic.find({_id:54708407});//范围查询db.orderSlic.find({"_id":{"$gte":54708407,"$lte":54708409}});//多字段分组统计db.orderSlic.aggregate([{$group:{_id:{shopId:"$......