Golang桌面应用开发GOTK3 Glade GTK主题

GOTK3 简介

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

GOTK3 Github

GOTK3 官方示例

GOTK3 开发环境

注: 以下操作均在 Mac 环境

  1. gtk+3版本

安装 GTK+3

  • GTK Github

  • GTK官网

    • https://www.gtk.org/
    • https://www.gtk.org/docs/
    • https://docs.gtk.org/gtk4/
  • 组件文档

    • https://docs.gtk.org/gtk4/index.html#classes
    • https://docs.gtk.org/gtk4/class.Button.html
# 安装相关依赖
xcode-select --install
brew install pkg-config
# 是否支持GTK+
brew search gtk
# 安装gtk+3
brew install gtk+3
# 验证是否安装成功
pkg-config --cflags --libs gtk+-3.0
  • 配置环境变量
# 检查 pkgconfig 路径
find / -name pkgconfig
# 将以上路径添加到环境变量中(.bash_profile 或 .zshrc)
vim ~/.zshrc
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 ~/.zshrc

安装 Glade

Glade是一个用于创建GTK图形用户界面的用户界面构建器。它允许开发者通过可视化方式设计和布局GUI元素,而不必手动编写代码。Glade生成XML格式的描述文件,描述了用户界面的结构和属性。然后,这个XML文件可以由程序加载和解释,从而创建用户界面。

  • 可视化设计:Glade提供了一个直观的图形用户界面,允许用户通过拖放方式设计和布局界面元素,无需手动编写代码。
  • 生成XML描述文件:设计完成后,Glade会生成一个XML格式的描述文件,其中包含了用户界面的结构和属性信息。
  • 与多种编程语言兼容:由于生成的描述文件是基于XML的,因此可以与多种编程语言一起使用。GTK支持多种编程语言,包括C、C++、Python等。
  • 与IDE集成:Glade可以与多个集成开发环境(IDE)一起使用,例如GNOME Builder,以便更方便地进行开发和调试。
  • Glade Github
    • https://github.com/GNOME/glade
    • https://gitlab.gnome.org/GNOME/glade
  • Glade 教程
    • https://developer.gnome.org/
  • 安装 Glade
# 目前版本支持gtk+3
brew install glade
glade --version
# 启动glade
glade
  • Glade 操作界面
    在这里插入图片描述

  • 保存后会生成如下 demo.glade 文件

<?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

示例使用 gtk+3demo.glade 文件构建界面

package main

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

func main() {
	gtk.Init(nil)
	builder, err := gtk.BuilderNewFromFile("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.SetPosition(gtk.WIN_POS_CENTER)
	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)
	})
}

运行效果

go mod tidy
go run main.go

在这里插入图片描述

GTK 主题

  • https://www.gnome-look.org/browse?cat=135&ord=latest

推荐主题

  • https://www.gnome-look.org/p/1403328

  • https://github.com/vinceliuice/WhiteSur-gtk-theme

  • https://www.gnome-look.org/p/1357889

  • https://github.com/vinceliuice/Orchis-theme

  • https://github.com/vinceliuice/Mojave-gtk-theme

  • https://github.com/paullinuxthemer/Prof-Gnome

全局主题配置

  • GTK主题
# Mac 主题文件解压到.themes
# Windows msys64/mingw64/share/themes
cd ~/.themes

在这里插入图片描述

# 确保文件夹包含诸如 index.theme 文件以及其他图标和资源文件
ls ~/.themes/WhiteSur-Dark
  • 设置主题
# Mac GTK配置文件settings.ini
# Windows msys64/mingw64/etc/gtk-3.0
vim ~/.config/gtk-3.0/settings.ini
# 添加主题
[Settings]
gtk-theme-name = WhiteSur-Dark
gtk-icon-theme-name = WhiteSur-Dark
  • 运行效果
    在这里插入图片描述

  • 更新GTK缓存

gtk-update-icon-cache -f ~/.themes/WhiteSur-Dark

项目主题配置

  • GTK主题
# Mac 主题文件解压到.themes
# Windows msys64/mingw64/share/themes
cd ~/.themes

在这里插入图片描述

  • 通过代码指定主题

代码优先级高于settings.ini配置文件

func main() {
	gtk.Init(nil)

	// 设置 GTK_THEME 环境变量
	os.Setenv("GTK_THEME", "WhiteSur-Dark")

	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()
}

在这里插入图片描述

  • GTK_CSD配置(默认值为0)

GTK_CSD=1时应用样式完全按主题样式

func main() {
	gtk.Init(nil)

	// 设置 GTK_THEME 环境变量
	os.Setenv("GTK_THEME", "WhiteSur-Dark")
	// 设置环境变量,GTK_CSD=1应用主题样式
	os.Setenv("GTK_CSD", "1")

	builder, err := gtk.BuilderNewFromFile("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()
}

Mac 电脑上显示效果
在这里插入图片描述

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逢生博客

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值