GTK (简体中文)
摘自GTK+ 官方网站:
- GTK+,或称 GIMP Toolkit,是一个跨平台的图形界面开发库。该库提供各式各样的窗口部件,小到一次性使用的程序、大到大型应用,GTK+ 都能满足你的需求。
GTK+,或称 GIMP Toolkit,最初由GNU项目为图像编辑软件GIMP开发,但现在它已经被广泛地应用在各种语言的图形界面编程中。
配置工具
使用下列GUI(图形界面)程序,可以调整GTK+程序主题、字体等设置。其基本原理是修改~/.gtkrc-2.0
文件。
- lxappearance:来自LXDE的配置工具,不过不依赖任何LXDE或其他桌面环境组件。比起其他配置工具,可定制性更强。
- gtk-chtheme
- gtk-theme-switch2AUR
- gtk2_prefsAUR
安装,以gtk-theme-switch2AUR为例:
# pacman -S gtk-theme-switch2
另见:为不同图形库分别设置外观[断开的链接:无效的部分]。
主题
GTK+ 1.x
古老的GTK+1程序(如xmms)默认主题很难看。改进方法:
- 下载并安装一些好看的主题
- 修改主题
AUR上有不错的主题:gtk-smooth-engineAUR[断开的链接:package not found]
可以使用gtk-theme-switch2修改主题。
GTK+ 2.x
多数桌面环境都会提供配置GTK+主题、图标、字体的工具。此外,下面提到的这些工具也很不错。
建议同时安装一些好看的GTK+2主题,比如Clearlooks(包含在gtk-engines软件包):
# pacman -S gtk-engines
AUR上还有更多主题:
- https://aur.archlinux.org/packages.php?O=0&K=gtk2-theme&do_Search=Go
- https://aur.archlinux.org/packages.php?O=0&K=gtk-theme&do_Search=Go
可以手动修改配置文件~/.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-dejavu、tangerine-icon-themeAUR、gtk-engine-murrine以及AUR中的gtk-theme-murrine-collectionAUR.
GTK+ 3.x
如果使用 GNOME 3,可以使用gnome-tweak-tool[断开的链接:replaced by gnome-tweaks]配置主题。安装:
# pacman -S gnome-tweak-tool
如果不想用gnome-tweak-tool[断开的链接:replaced by gnome-tweaks],需要自己编辑{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-icon-theme-name = 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版本:
- Adwaita (part of gnome-themes-standard[断开的链接:package not found])
- Newlooks for GTK+ 3 and Clearlooks for GTK+ 2
- Zukitwo
- Elegant Brit
- Atolm
- Hope
GTK+ 与 QT
同时在系统上安装GTK+和QT(通常是KDE组件)程序的人都知道,两者的外观并不怎么协调。关于两者外观统一的问题,参见:协调QT和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优化配置参见此文[失效链接 2020-08-02 ⓘ]。此外,使用该主题即可搞定上面所有配置。
开发
使用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
- 依赖:zenity
hello_world.sh
#!/bin/bash zenity --info --title='Hello world!' --text='This is an example dialog.'
Boo
- 依赖: gtk-sharp-gitAUR 来自 AUR (booAUR)
- 编译依赖: booAUR
- 编译:
booc hello_world.boo
- 运行:
mono hello_world.exe
(orbooi 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
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
- 依赖: perl-gtk3 来自 AUR
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
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-basicAUR
- 编译:
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