使用 gtkaml 编写 GTK+ 界面
想必大家对 GTK+ 跑在 HTML5 上已经不感到惊讶了,那么用 XML 编写 GTK+ 界面呢?好吧,Glade 是这样做的,不过今天介绍的不是它,而是 gtkaml。
按照官网的介绍,gtkaml 是基于 Vala 的一种标记语言,旨在使用简洁的 XML 语法来描述 GTK+ 界面,乍看起来和 Glade 没有什么区别。
不过 gtkaml 采用的是类似于 Glade 2 的转换代码方式,将 XML 转换成 Vala 代码再进行编译。不过,不用担心图形界面和实际代码分离的问题,因为 gtkaml 在 XML 中预留了 Vala 代码的空间,也就是说,你不需要面对自动转换得到的很可能难懂的代码进行修改,而只需要在 XML 中直接书写 Vala 代码即可!
另外,觉得标准的 XML 太过繁复? gtkaml 还提供了一种叫做 gtkon 的语法,允许你使用类似 JSON 的语法编写界面,语法一下子就简洁了好多,看个 Hello World 吧(来自 Vala Code):
Window using=Gtk name=GtkHello type={WindowType.TOPLEVEL} title="First GTK+ Program"
position={WindowPosition.CENTER} default-width=300 default-height=50 destroy=Gtk.main_quit
{
Button label="Click me!" clicked={target.label="Thank you"};
-{
static int main (string[] args) {
Gtk.init (ref args);
var window = new GtkHello ();
window.show_all ();
Gtk.main ();
return 0;
}
}-
}
怎么样?在 Vala 代码中,根本就没有怎么写与界面相关的东西,是不是很 Cool?更多代码可以看官方 Wiki 的样例。
另外,虽然 gtkaml 现在仅支持 Vala 和 GTK+,不过根据官方介绍, Genie 的支持也在计划中,而只要有 vapi 的库,都可以使用 gtkaml 而不限于 GTK+,相信 gtkaml 的前景应该不赖。
人生苦短,我用 Genie
这篇文章已经酝酿很久了,不过一直没时间没心情写。今天到学校开始学日语了,又看到 WowUbuntu 介绍的日语 50 音图测试软件 Kanatest 在 Arch 的 AUR 里面找不到,所以干脆自己写一个,顺便补上这篇文章。
进入正题,开发一个 Linux 下的软件,你选择的编程语言是什么呢?我想大多数人会选择 C 或者 Python 吧。像上面说的 50 音图测试软件,用 C 开发有些大材小用了,用 Python 呢,要是涉及运算的时候速度又不尽人意。
那么用什么呢?Google 的 Go 语言?库还不完善呢。Vala?有些人会想到这个 GNOME 的项目了,确实,Vala 对于熟悉 C# 的朋友可能十分顺手,可是对于更加喜欢 Python 的朋友,或许就不是那么友好了。
好的,我们的主角登场了,Genie!
既然你知道 Vala,或许你也知道,它只是对 C 语言的一个包装,运行效率与 C 相差无几。Genie 语言就是 Vala 的同胞弟弟,它也是对 C 语言的包装和翻译,能够实现 Vala 的所有特性,甚至“编译器”都是相同的——valac!唯一不同的是,Genie 是以 Boo、Python 等脚本语言为蓝本,语法上更加灵活、简洁,如果你学过 Python,Genie 的入门将十分之快!
来看看我写的这个简单的 50 音图背诵软件吧,功能很简单,就是将日语的平假名随机闪现,相信有 GTK+ 基础的朋友很容易就可以看懂。
/* Build with valac --pkg gtk+-2.0 mykana.gs */
[indent=4]
uses
Gtk
init
Gtk.init(ref args)
var window = new MainWindow()
window.show_all()
Gtk.main()
class MainWindow: Window
label: Label
const chars : array of string = {"あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ", "た", "ち", "ち", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま", "み", "む", "め", "も", "や", "う", "よ", "ら", "り", "る", "れ", "ろ", "わ", "を", "ん"}
init
title = "My Kana"
window_position = WindowPosition.CENTER
default_width = 250
default_height = 250
destroy.connect(Gtk.main_quit)
label = new Label(null)
add(label)
Timeout.add_seconds(1, this.change_char)
def change_char(): bool
var i = Random.int_range(0, 46)
var output = Markup.printf_escaped("%s", chars[i])
label.set_markup(output)
return true
可以看出,除了类型声明之外,从某种程度上讲,Genie 的语法甚至比 Python 更加简单。而且,通过使用 libgee,Genie 甚至可以使用等同于 Python 中的 list、dict 等类型,功能十分强大。Genie 与 Vala 共用 API,所以库的问题也不用担心。
不过,Genie 创造于 2008 年,年纪还很轻,文档还不够全。就如同 Vala 一样,Genie 的语法也在发展之中。如果你觉得这些都不是问题,那么赶快看看文档学习一下吧!
我觉得很不错的一些文档:官方指南、来自 Puppy Linux 的指南、官方代码示例。
