golang GTK3图形界面开发绑定插件库gotk3的使用

Golang GTK3图形界面开发绑定插件库gotk3的使用

gotk3项目为GTK 3及其相关项目提供了Go语言绑定。每个组件都有自己的子目录,作为包的导入路径使用。目前实现了以下库的部分绑定支持:

  • GTK 3 (3.12及更高版本)
  • GDK 3 (3.12及更高版本)
  • GLib 2 (2.36及更高版本)
  • Cairo (1.10及更高版本)

示例用法

基础示例

package main

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

func main() {
    // 初始化GTK,不解析任何命令行参数
    gtk.Init(nil)

    // 创建一个新的顶层窗口,设置标题,并连接到"destroy"信号以便在窗口销毁时退出GTK主循环
    win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
    if err != nil {
        log.Fatal("无法创建窗口:", err)
    }
    win.SetTitle("简单示例")
    win.Connect("destroy", func() {
        gtk.MainQuit()
    })

    // 创建一个新的标签控件显示在窗口中
    l, err := gtk.LabelNew("Hello, gotk3!")
    if err != nil {
        log.Fatal("无法创建标签:", err)
    }

    // 将标签添加到窗口
    win.Add(l)

    // 设置默认窗口大小
    win.SetDefaultSize(800, 600)

    // 递归显示窗口中包含的所有控件
    win.ShowAll()

    // 开始执行GTK主循环。这会阻塞直到gtk.MainQuit()被调用
    gtk.Main()
}

构建示例:

$ go build example.go

如果要使用旧版GTK构建,可以使用gtk_3_10标签:

$ go build -tags gtk_3_10 example.go

应用示例

package main

import (
    "log"
    "os"

    "github.com/gotk3/gotk3/glib"
    "github.com/gotk3/gotk3/gtk"
)

// 用Go编写的简单Gtk3应用
// 这个应用在activate回调时创建一个窗口

func main() {
    // 创建Gtk应用,将appID改为你应用的逆向域名
    const appID = "org.gtk.example"
    application, err := gtk.ApplicationNew(appID, glib.APPLICATION_FLAGS_NONE)
    // 检查创建Gtk应用时是否有错误
    if err != nil {
        log.Fatal("无法创建应用.", err)
    }
    
    // 可用的应用信号
    // startup -> 应用首次启动时设置
    // activate -> 显示应用的默认第一个窗口(如新文档)。这对应于桌面环境启动应用
    // open -> 打开文件并在新窗口中显示。这对应于有人尝试从文件浏览器等使用应用打开文档
    // shutdown -> 执行关闭任务
    
    // 设置activate信号与闭包函数
    application.Connect("activate", func() {
        // 创建应用窗口
        appWindow, err := gtk.ApplicationWindowNew(application)
        if err != nil {
            log.Fatal("无法创建应用窗口.", err)
        }
        // 设置应用窗口属性
        appWindow.SetTitle("基础应用.")
        appWindow.SetDefaultSize(400, 400)
        appWindow.Show()
    })
    // 运行Gtk应用
    application.Run(os.Args)
}

安装

gotk3当前需要GTK 3.6-3.24、GLib 2.36-2.46和Cairo 1.10或1.12。还需要较新的Go版本(1.8或更高)。

使用废弃功能

默认情况下,构建中不包含废弃的GTK功能。

通过指定构建标签如gtk_3_20,GTK 3.20或更早版本中废弃的任何功能将不可用。要在构建中启用废弃功能,添加gtk_deprecated标签。

示例:

$ go build -tags "gtk_3_10 gtk_deprecated" example.go

对于gdk-pixbuf也有类似的标签:gdk_pixbuf_deprecated

许可证

gotk3包采用自由的ISC许可证授权。


更多关于golang GTK3图形界面开发绑定插件库gotk3的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang GTK3图形界面开发绑定插件库gotk3的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang GTK3 图形界面开发:gotk3 使用指南

gotk3 是 Go 语言绑定 GTK3 的工具库,允许开发者使用 Go 语言创建跨平台的图形界面应用程序。下面我将详细介绍 gotk3 的基本使用方法。

安装 gotk3

首先需要安装 gotk3 及其依赖:

# 安装 GTK3 开发库 (Ubuntu/Debian)
sudo apt-get install libgtk-3-dev

# 安装 gotk3
go get github.com/gotk3/gotk3/gtk

基础示例:创建窗口

package main

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

func main() {
	// 初始化 GTK
	gtk.Init(nil)

	// 创建主窗口
	win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
	if err != nil {
		log.Fatal("无法创建窗口:", err)
	}

	// 设置窗口属性
	win.SetTitle("GTK3 Go 示例")
	win.SetDefaultSize(400, 300)
	win.SetPosition(gtk.WIN_POS_CENTER)

	// 连接窗口关闭事件
	win.Connect("destroy", func() {
		gtk.MainQuit()
	})

	// 创建按钮
	btn, err := gtk.ButtonNewWithLabel("点击我")
	if err != nil {
		log.Fatal("无法创建按钮:", err)
	}

	// 连接按钮点击事件
	btn.Connect("clicked", func() {
		dialog := gtk.MessageDialogNew(
			win,
			gtk.DIALOG_MODAL,
			gtk.MESSAGE_INFO,
			gtk.BUTTONS_OK,
			"按钮被点击了!",
		)
		dialog.Run()
		dialog.Destroy()
	})

	// 将按钮添加到窗口
	win.Add(btn)

	// 显示所有控件
	win.ShowAll()

	// 进入 GTK 主循环
	gtk.Main()
}

常用组件示例

1. 布局容器

// 创建垂直布局
box, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 6)

// 创建水平布局
hbox, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 6)

// 创建网格布局
grid, _ := gtk.GridNew()
grid.SetRowSpacing(6)
grid.SetColumnSpacing(6)

2. 输入控件

// 创建文本框
entry, _ := gtk.EntryNew()
entry.SetPlaceholderText("请输入内容")

// 创建多行文本框
textView, _ := gtk.TextViewNew()
buffer, _ := textView.GetBuffer()
buffer.SetText("多行文本内容")

// 创建复选框
check, _ := gtk.CheckButtonNewWithLabel("选项")
check.SetActive(true) // 设置为选中状态

3. 列表控件

// 创建列表存储
listStore, _ := gtk.ListStoreNew(glib.TYPE_STRING, glib.TYPE_INT)

// 添加数据
iter := listStore.Append()
listStore.Set(iter, []int{0, 1}, []interface{}{"项目1", 100})

// 创建树视图
treeView, _ := gtk.TreeViewNewWithModel(listStore)

// 添加列
renderer, _ := gtk.CellRendererTextNew()
col1, _ := gtk.TreeViewColumnNewWithAttribute("名称", renderer, "text", 0)
col2, _ := gtk.TreeViewColumnNewWithAttribute("值", renderer, "text", 1)
treeView.AppendColumn(col1)
treeView.AppendColumn(col2)

信号处理

gotk3 使用 Connect 方法连接信号:

button.Connect("clicked", func() {
    fmt.Println("按钮被点击")
})

entry.Connect("changed", func() {
    text, _ := entry.GetText()
    fmt.Println("输入内容:", text)
})

window.Connect("key-press-event", func(win *gtk.Window, ev *gdk.Event) {
    keyEvent := &gdk.EventKey{ev}
    if keyEvent.KeyVal() == gdk.KEY_Escape {
        win.Close()
    }
})

完整应用示例

package main

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

func main() {
	gtk.Init(nil)

	// 创建主窗口
	win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
	if err != nil {
		log.Fatal("无法创建窗口:", err)
	}
	win.SetTitle("GTK3 完整示例")
	win.SetDefaultSize(400, 300)
	win.Connect("destroy", gtk.MainQuit)

	// 创建垂直布局
	vbox, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 6)
	vbox.SetMarginTop(12)
	vbox.SetMarginBottom(12)
	vbox.SetMarginStart(12)
	vbox.SetMarginEnd(12)

	// 添加标签
	label, _ := gtk.LabelNew("欢迎使用 GTK3 Go 绑定")
	vbox.Add(label)

	// 添加输入框
	entry, _ := gtk.EntryNew()
	entry.SetPlaceholderText("输入内容...")
	vbox.Add(entry)

	// 添加按钮
	btn, _ := gtk.ButtonNewWithLabel("提交")
	btn.Connect("clicked", func() {
		text, _ := entry.GetText()
		label.SetText("你输入了: " + text)
	})
	vbox.Add(btn)

	// 添加复选框
	check, _ := gtk.CheckButtonNewWithLabel("启用高级选项")
	vbox.Add(check)

	// 将布局添加到窗口
	win.Add(vbox)

	// 显示所有控件
	win.ShowAll()

	// 进入主循环
	gtk.Main()
}

注意事项

  1. GTK 操作必须在主线程执行
  2. 所有 GTK 调用应该在 gtk.Init() 之后
  3. 使用 gtk.Main() 启动主循环
  4. 内存管理由 GTK 自动处理,通常不需要手动释放资源

gotk3 提供了完整的 GTK3 功能绑定,可以创建复杂的图形界面应用程序。更多高级功能可以参考官方文档和示例代码。

回到顶部