GTK+ (简体中文)

From ArchWiki
Jump to: navigation, search
翻译状态: 本文是英文页面 GTK+翻译,最后翻译时间:2013-02-18,点击这里可以查看翻译后英文页面的改动。

摘自GTK+ 官方网站

GTK+,或称 GIMP Toolkit,是一个跨平台的图形界面开发库。该库提供各式各样的窗口部件,小到一次性使用的程序、大到大型应用,GTK+ 都能满足你的需求。

GTK+,或称 GIMP Toolkit,最初由GNU项目为图像编辑软件GIMP开发,但现在它已经被广泛地应用在各种语言的图形界面编程中。

配置工具

使用下列GUI(图形界面)程序,可以调整GTK+程序主题、字体等设置。其基本原理是修改~/.gtkrc-2.0文件。

安装,以gtk-theme-switch2为例:

# pacman -S gtk-theme-switch2

另见:为不同图形库分别设置外观

主题

GTK+ 1.x

古老的GTK+1程序(如xmms)默认主题很难看。改进方法:

  1. 下载并安装一些好看的主题
  2. 修改主题

AUR上有不错的主题:gtk-smooth-engineAUR

可以使用gtk-theme-switch2修改主题。

GTK+ 2.x

多数桌面环境都会提供配置GTK+主题、图标、字体的工具。此外,下面提到的这些工具也很不错。

建议同时安装一些好看的GTK+2主题,比如Clearlooks(包含在gtk-engines软件包):

# pacman -S gtk-engines

AUR上还有更多主题:

可以手动修改配置文件~/.gtkrc-2.0来配置GTK+。GNOME图书馆提供了各种设置的清单。下面给出了配置GTK+主题、图标、字体和字体大小的示范:

~/.gtkrc-2.0
gtk-icon-theme-name = "[图标主题名称]"
gtk-theme-name = "[主题名称]"
gtk-font-name = "[字体名] [大小]"

例如:

~/.gtkrc-2.0
gtk-icon-theme-name = "Tango"
gtk-theme-name = "Murrine-Gray"
gtk-font-name = "DejaVu Sans 8"

{{注意|使用上述配置,需要安装软件包ttf-dejavutangerine-icon-themegtk-engine-murrine以及AUR中的gtk-theme-murrine-collectionAUR.

GTK+ 3.x

如果使用 GNOME 3,可以使用gnome-tweak-tool配置主题。安装:

# pacman -S gnome-tweak-tool

如果不想用gnome-tweak-tool,需要自己编辑{XDG_CONFIG_HOME}/gtk-3.0/settings.ini(通常为~/.config/gtk-3.0/settings.ini)设置主题。文件示例:

{XDG_CONFIG_HOME}/gtk-3.0/settings.ini
[Settings]
gtk-application-prefer-dark-theme = false
gtk-theme-name = Zukitwo
gtk-fallback-icon-theme = gnome

如果还是不起作用,那么删除旧的{XDG_CONFIG_HOME}/gtk-3.0目录,并从主题路径复制新的gtk-3.0目录。例如:

rm -r ~/.config/gtk-3.0/
cp -r /usr/share/themes/Zukitwo/gtk-3.0/ ~/.config/  

然后,你需要在桌面环境的外观配置工具中使用相同主题。只有少数几款主题同时提供了外观统一的GTK+3和GTK+2版本:

  1. Adwaita (part of gnome-themes-standard)
  2. Newlooks for GTK+ 3 and Clearlooks for GTK+ 2
  3. Zukitwo
  4. Elegant Brit
  5. Atolm
  6. Hope
注意: 有些主题需要librsvg才能正常显示,如果出现主题界面不正常,可以尝试安装它。
注意: 未来可能还会有其他提供统一外观的跨GTK+版本主题,有些主题在AUR中可以找到。此外,其中某些主题在某些情况会出现问题,比如GTK+2面板(浅色底、浅色字),所以最好使用这里提供的面板背景。

GTK+ 与 QT

同时在系统上安装GTK+和QT(通常是KDE组件)程序的人都知道,两者的外观并不怎么协调。关于两者外观统一的问题,参见:协调QT和GTK+程序的外观

配置文件

注意: 参见GTK+编程手册中的GtkSettings设置部分,以了解所有GTK+配置选项。

本节介绍了许多GTK+设置,可用在~/.gtkrc-2.0文件中。

使用自定义键盘快捷键

有个秘密技巧:把鼠标放在某个菜单项,然后按下某个按键组合,即可修改该项目的快捷键。不过,该功能默认是关闭的。启用方法是使用以下配置:

gtk-can-change-accels = 1

加速 GNOME 菜单显示

鼠标指向菜单与菜单显示之间有一个延迟,以下设置就是该延迟时间(应该是以毫秒为单位):

gtk-menu-popup-delay = 0

缩小窗口部件

如果屏幕很小,不喜欢过大的图标和窗口部件,可以调整其尺寸。

工具栏仅显示图标:

gtk-toolbar-style = GTK_TOOLBAR_ICONS

显示小图标:

gtk-icon-sizes = "panel-menu=16,16:panel=16,16:gtk-menu=16,16:gtk-large-toolbar=16,16\
:gtk-small-toolbar=16,16:gtk-button=16,16"

按钮上不显示图标:

gtk-button-images = 0

菜单不显示图标:

gtk-menu-images = 0

更多gtkrc优化配置参见此文。此外,使用该主题即可搞定上面所有配置。

开发

使用gcc编译C语言的GTK+3程序时,需要添加一些CFLAGS(编译开关):

gcc -g -Wall `pkg-config --cflags --libs gtk+-3.0` -o base base.c

-g 和 -Wall 是可选的,程序调试时会用到。

官方提供了一个示范程序:Hello World

编写简单的对话框

通过GObject-Introspection或语言接口,可以轻松地使用各种语言编写GTK+3程序,甚至bash也可以。

下列示例程序会在屏幕上显示一个信息对话框,上面写有“Hello world”。

Bash

hello_world.sh
#!/bin/bash
zenity --info --title='Hello world!' --text='This is an example dialog.'

Boo

  • 依赖: gtk-sharp-gitAUR 来自 AUR (boo)
  • 编译依赖: boo
  • 编译: booc hello_world.boo
  • 运行: mono hello_world.exe (or booi hello_world.boo)
hello_world.boo
import Gtk from "gtk-sharp"
Application.Init()
Hello = MessageDialog(null, DialogFlags.Modal, MessageType.Info, ButtonsType.Close, "Hello world!")
Hello.SecondaryText = "This is an example dialog."
Hello.Run()

C

  • 依赖:gtk3
  • 编译:gcc -o hello_world `pkg-config --cflags --libs gtk+-3.0` hello_world.c
hello_world.c
#include <gtk/gtk.h>
void main (int argc, char *argv[]) {
	gtk_init (&argc, &argv);
        GtkWidget *hello = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Hello world!");
	gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (hello), "This is an example dialog.");
        gtk_dialog_run(GTK_DIALOG (hello));
}

C++

  • 依赖:gtkmm3
  • 编译:g++ -o hello_world `pkg-config --cflags --libs gtkmm-3.0` hello_world.cc
hello_world.cc
#include <gtkmm.h>
#include <gtkmm/messagedialog.h>
int main(int argc, char *argv[]) {
	Gtk::Main kit(argc, argv);
	Gtk::MessageDialog Hello("Hello world!", false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK);
	Hello.set_secondary_text("This is an example dialog.");
	Hello.run();
}

C#

  • 依赖: gtk-sharp-gitAUR 来自 AUR
  • 编译: mcs -pkg:gtk-sharp-3.0 hello_world.cs
  • 运行: mono hello_world.exe
hello_world.cs
using Gtk;
public class HelloWorld {
	static void Main() {
		Application.Init ();
		MessageDialog Hello = new MessageDialog (null, DialogFlags.Modal, MessageType.Info, ButtonsType.Close, "Hello world!");
		Hello.SecondaryText="This is an example dialog.";
		Hello.Run ();
	}
}

Genie

  • 依赖:gtk3
  • 编译时依赖:vala
  • 编译:valac --pkg gtk+-3.0 hello_world.gs
hello_world.gs
uses 
	Gtk
init
	Gtk.init (ref args)
	var Hello=new MessageDialog (null, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Hello world!")
	Hello.format_secondary_text ("This is an example dialog.")
	Hello.run ()

Java

  • 依赖: java-gnomeAUR 来自 AUR
  • 编译依赖: java-environment
  • 编译: mkdir HelloWorld && javac -classpath /usr/share/java/gtk.jar -d HelloWorld HelloWorld.java
  • 运行: java -classpath /usr/share/java/gtk.jar:HelloWorld HelloWorld
HelloWorld.java
import org.gnome.gtk.Gtk;
import org.gnome.gtk.Dialog;
import org.gnome.gtk.InfoMessageDialog;

public class HelloWorld
{
    public static void main(String[] args) {
        Gtk.init(args);
        Dialog Hello = new InfoMessageDialog(null, "Hello world!", "This is an example dialog.");
        Hello.run();
    }
}

JavaScript

hello_world.js
#!/usr/bin/gjs
Gtk = imports.gi.Gtk
Gtk.init(null, null)
Hello = new Gtk.MessageDialog({type: Gtk.MessageType.INFO,
                               buttons: Gtk.ButtonsType.OK,
                               text: "Hello world!",
                               "secondary-text": "This is an example dialog."})
Hello.run()

Perl

hello_world.pl
#!/usr/bin/perl
use Gtk3 -init;
my $hello = Gtk3::MessageDialog->new (undef, 'modal', 'info', 'ok', "Hello world!");
$hello->set ('secondary-text' => 'This is an example dialog.');
$hello->run;

Python

hello_world.py
#!/usr/bin/python
from gi.repository import Gtk
Gtk.init(None)
Hello=Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.CLOSE, "Hello world!")
Hello.format_secondary_text("This is an example dialog.")
Hello.run()

Vala

  • 依赖:gtk3
  • 编译时依赖:vala
  • 编译:valac --pkg gtk+-3.0 hello_world.vala
hello_world.vala
using Gtk;
public class HelloWorld {
	static void main (string[] args) {
		Gtk.init (ref args);
		var Hello=new MessageDialog (null, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Hello world!");
		Hello.format_secondary_text ("This is an example dialog.");
		Hello.run ();
	}
}

Visual Basic .NET

  • 依赖: gtk-sharp-gitAUR 来自 AUR
  • 编译依赖: mono-basic
  • 编译: vbnc -r:/usr/lib/mono/gtk-sharp-3.0/gio-sharp.dll -r:/usr/lib/mono/gtk-sharp-3.0/glib-sharp.dll -r:/usr/lib/mono/gtk-sharp-3.0/gtk-sharp.dll hello_world.vb
  • 运行: mono hello_world.exe
hello_world.vb
Imports Gtk
Public Class Hello
	Inherits MessageDialog
	Public Sub New
		MyBase.New(Me, DialogFlags.Modal, MessageType.Info, ButtonsType.Close, "Hello world!")
		Me.SecondaryText = "This is an example dialog."
	End Sub
	Public Shared Sub Main
		Application.Init
		Dim Dialog As New Hello
		Dialog.Run
	End Sub
End Class

相关资源