GTK

GTK（原名GTK+）最初是GIMP的专用开发库（GIMP Toolkit），后来发展为Unix-like系统下开发图形界面的应用程序的主流开发工具之一。GTK是自由软件，并且是GNU计划的一部分。自2019年2月6日起，GTK+改名为GTK。

## 软件架构

<image>

<image>

<image>

GTK 包含了一组图形控制元素（部件）；版本3.22.16包含了186个活跃的和36个废弃的部件。GTK是用C语言编写的一个面向对象的部件工具；它使用GObject，即GLib对象系统，来实现面向对象。虽然GTK主要是为基于X11和Wayland的窗口系统设计的，但它也可以在其他平台上运行，包括Microsoft Windows（与Windows API接口），和macOS（与Quartz接口）。还有一个名为Broadway的HTML5后端。

GTK可以配置不同的显示引擎来改变绘制部件的外观。有几种显示引擎可以模仿所使用平台上的原生部件的外观。

从2005年发布的版本2.8开始，GTK开始使用Cairo来渲染大多数图形控制元素（部件）。自从GTK版本3.0开始，所有的渲染都是使用Cairo完成的。

在2018年1月26日的DevConf.cz上，GTK重要开发者Matthias Clasen介绍了GTK 4开发的当前状态，包括对GTK 3中渲染和输入工作方式的高层次解释，GTK 4 (>3.90)中正在进行的变化以及原因。在2019年2月6日，宣布GTK 4将从项目名称中去掉“+”号。

### GTK绘图工具包（GDK）

GDK是对底层窗口系统和图形系统提供的低级函数的封装。

### GTK场景图工具包（GSK）

GSK是GTK的渲染和场景图API。GSK位于图形控制元素（部件）和渲染之间。GSK最终在2017年3月发布的GTK版本3.90中合并。

### GtkInspector

GtkInspector在版本3.14中引入。GtkInspector只能在安装了开发包libgtk-3-dev/gtk±devel后调用。

### GUI设计器

有几个GUI设计器可用于GTK。以下项目截至2011年7月仍在活跃：

- Glade，支持GtkBuilder，这是一个GTK内置的GUI描述格式。
- Gazpacho，用Python编写的GTK工具包的GUI构建器
- Crow Designer，依赖于它自己的GuiXml格式和GuiLoader库。
- Stetic，作为MonoDevelop的一部分，面向Gtk#。
- Gambas自版本2.0开始基于BASIC
- Xojo在Linux
- Lazarus在Linux上默认与GTK 2接口

#### GtkBuilder

GtkBuilder允许在不编写代码的情况下设计用户界面。界面在XML文件中描述，然后在运行时加载并自动创建对象。Glade界面设计器允许以“所见即所得”（WYSIWYG）的方式创建用户界面。用户界面的描述与使用的编程语言无关。

## 编程语言

GTK使用C语言开发，但是其设计者使用面向对象技术。也提供了Vala、C++（gtkmm）、Perl、Ruby、Java和Python（PyGObject）绑定，其他的绑定有Ada、D、Haskell、PHP和所有的.NET编程语言。

与其他很多部件工具箱不同，GTK并不基于Xt。这一决策优劣互见：优点是GTK可以应用于其他系统，其灵活性也很强；而缺点就是它无法利用以传统方法为X11定制的X资源数据库。GTK最早应用于X Window System，如今已移植至其他平台，诸如Microsoft Windows、DirectFB，以及Mac OS X平台上的Quartz.

Glade是一个界面设计工具，但是它也包含了一种描述GUI界面的XML语言，它和libglade一起工作就可以直接使用GTK和GNOME控件；新的Glade-3不再直接支持生成编程语言源代码。

## 外观和视觉

提供不同的显示引擎使得最终用户可以定制外观和视觉。目前已经有一些可以模仿其他流行的平台或者工具箱（例如Windows 95、Motif、Qt或者NEXTSTEP）的引擎。

<image>

## 使用

使用GTK的环境

- GNOME是以GTK为基础，就是说为GNOME编写的程式使用GTK做为其工具箱。
- Xfce也基于GTK，但是它的应用程序并不对很多其他程式有依赖。（这就是"GNOME程式"和"GTK程式"的不同。）
- LXDE也基于GTK，一个尽可能减少套件相依性的桌面环境。
- GPE Palmtop环境和Nokia的互联网平板电脑的框架Maemo基于GTK。

这只是一部分，另外，GTK也可以运行在KDE的环境下。而且GTK也可以在Microsoft Windows运行，另外还有DirectFB和ncurses。

使用GTK的窗口管理器

- Mutter
- Metacity
- Marco
- Xfwm4
- Muffin
- Gala

### GTK应用程序

以下程序都是使用GTK开发、属于开源软件，可以运行于Linux/Unix，Windows，macOS等多种操作系统平台上。

- Firefox－Mozilla基金会的网页浏览器，在Linux下使用GTK。
- Geany－代码编辑器
- GIMP－类似于Photoshop的图像处理程序
- Inkscape－类似于Illustrator、CorelDraw的矢量图形绘制工具
- Pidgin－支持多种协议（IRC、Gtalk、Yahoo Talk、MSN等等）的聊天工具
- gcin－一种在Linux、Windows系统上常见的输入法平台

## 版本历史

主要版本｜发布日期｜主要增强｜最后次要版本

1.0｜1998年4月14日｜第一个稳定版本｜1.0.6

1.2｜1999年2月27日｜新增部件（GtkFontSelector）｜ 1.2.10

2.0｜2002年3月11日｜GObject, Unicode（UTF-8）支援｜2.0.9

2.2｜2002年12月22日｜Multihead support｜2.2.4

2.4｜2004年3月16日｜新增部件（GtkFileChooser、GtkComboBox、GtkComboBoxEntry、GtkExpander、GtkFontButton、GtkColorButton）｜ 2.4.14

2.6｜2004年12月16日｜New widgets（GtkIconView, GtkAboutDialog, GtkCellView）.最后一个支援Windows 98/Me的版本｜ 2.6.10

2.8｜2005年8月13日｜Cairo integration｜ 2.8.20

2.10｜2006年7月3日｜新增部件（GtkStatusIcon、GtkAssistant、GtkLinkButton、GtkRecentChooser）以及打印支援（GtkPrintOperation）｜ 2.10.14

2.12｜2007年9月14日｜GtkBuilder｜ 2.12.12

2.14｜2008年9月4日｜Jpeg2000 load support｜ 2.14.7

2.16｜2009年3月13日｜New GtkOrientable, Caps Lock warning in password Entry.Improvement on GtkScale, GtkStatusIcon, GtkFileChooser.｜ 2.16.6

2.18｜2009年9月23日｜New GtkInfoBar. Improvement on file chooser, printing.GDK has been rewritten to use 'client-side windows'｜ 2.18.9

2.20｜2010年3月23日｜New GtkSpinner and GtkToolPalette, GtkOffscreenWindow. Improvement on file chooser,keyboard handling, GDK.Introspection data is now included in GTK｜ 2.20.1

2.22｜2010年9月23日｜gdk-pixbuf moved to separate module, most GDK drawing are based on Cairo,many internal data are now private and can be sealed in preparation to GTK3｜ 2.22.1

2.24｜2011年1月30日｜New simple combo box widget (GtkComboBoxText) added, the cups print backend can send print jobs as PDF,GtkBuilder has gained support for text tags and menu toolbuttons and many introspection annotation fixes were added｜ 2.24.0

3.0｜2011年2月10日｜Cairo, more X11 agnostic, XInput2, CSS-based theme API｜ 3.0.0

## 图形无关代码

最初GTK包括一些和图形无关的常规功能，如链表和二叉树等数据结构。这些基本功能和对象系统GObject已经合并到独立的库Glib，它被程序员专门用于开发不需要图形界面的代码。

## GTK 2

2002年3月11日，GTK2.0版正式发布。GTK 2是GTK后继版本，其新特性包括使用Pango改进的文本渲染、新主题引擎、使用ATK改进的可达性、完全转换到使用UTF-8的Unicode和更灵活的API。但是它和GTK 1不完全兼容，因此必须由程序员做移植工作。由于GTK 1更快、相对更简单或更加适合嵌入式应用，所以还被继续使用。

从GTK 2的2.8版起，它依靠程式库Cairo完成渲染，而这引入了矢量图形的支持。

## 发展

Ridley项目正在尝试统一一系列和GTK相关的库，包括libgnome、libgnomeui、libgnomeprint、libgnomeprintui、libglade、libgnomecanvas、libegg、libeel和gtkglext。

## GTK hello world

GTK hello world以C撰写，本程序含有窗口，标题是"Hello, World".

```c
 #include <gtk/gtk.h>

 int main (int argc, char *argv[])
 {
    GtkWidget *window;
    GtkWidget *label;

    gtk_init (&argc, &argv);

    /* create the main, top level, window */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    /* give it the title */
    gtk_window_set_title (GTK_WINDOW (window), "Hello World");

    /* Connect the destroy signal of the window to gtk_main_quit
     * When the window is about to be destroyed we get a notification and
     * stop the main GTK loop
     */
    g_signal_connect (window, "destroy",
                      G_CALLBACK (gtk_main_quit), NULL);

    /* Create the "Hello, World" label  */
    label = gtk_label_new ("Hello, World");

    /* and insert it into the main window  */
    gtk_container_add (GTK_CONTAINER (window), label);

    /* make sure that everything, window and label, are visible */
    gtk_widget_show_all (window);

    /* start the main loop, and let it rest there until the application is closed */
    gtk_main ();

    return 0;
 }
```

## GTK Runtime Environment for Windows

由于GTK主要是作为Unix-like系统底下的界面，在Windows使用该系统所开发的软件时就需要用到GTK执行环境，即GTK Runtime Environment for Windows。这个软件与GTK不同的地方在于它仅仅是为了执行软件用途而制作，以解决Windows没有内建GTK函式库的问题。

## 参见

- Gtk#，GTK的.NET API。
- PyGTK，GTK的Python API。
- Qt
- Motif
- wxWidgets

## 外部链接

- GTK主页
- Computers/Software/Operating_Systems/Graphic_Subsystems/Toolkits/Gtk/

## 基本资料

- 作者：Spencer Kimball、Peter Mattis、eXperimental Computing Facility
- 开发者：GNOME计划
- 发行日期：1998年4月14日
- 编程语言：C语言
- 操作系统：Linux、类Unix系统、macOS、Microsoft Windows
- 类型：部件工具箱
- 许可协议：GNU宽通用公共许可证2.1