PHP开发学堂:PHP-GTK 介绍及其应用
1. PHP-GTK介绍
1.1 PHP-GTK
PHP-GTK是PHP的延伸模组,它可以让程序设计师写出在客户端执行的、且独立的GUI的程序。这个模组不允许在浏览器上显视GTK+的程序,它一开始就是开发来写独立的GUI程序的。
1.2 GTK
GTK原本是为GIMP,一个GUI的影像处理软体而开发的。GTK+是GIMP的套装工具。GTK+从这里开始发展,直到现在已经成为Gnome的中心(Gnome是一个桌面环境)。后来GTK+也已经被推广到BeOS和Win32,使得它成为PHP延伸模组的最佳选择,维持PHP可以跨平台并可以用PHP为Linux,BeOS,Windows等平台开发视窗接口的程序。
2. PHP-GTK概念
2.1 前言
接下来就要教各位一点点比较观念性的东西罗┅因为这章的概念都是非常重要的,所以就算不懂,也还是要慢慢的看懂它,不然┅以后就┅。还有,接下来的内容不建议没有程序设计经验的读者阅读,因为有很多的观念很容易会搞不清楚。还有,接下来该用英文的部分我都会用英文,这样大家在看国外文件的时候才不会不知所措,加油吧!!如果对本章有任何不懂之处,请自行查阅
PHP-GTK Manual:http://gtk.php.net/manual/en/
2.2 Widget(s)
Widget是一个GUI程序中基本的functions和forms。最常用的几个Widget是:label、button、window、frame和text box。所有的widget都是来自于一个抽象的基本class─GtkWidget。每个widget都是一个class
一个Widget一生大概都有五个时期:
1. 建立(Creation):宣告一个对象(declaring an object)
2. 放置(Placement):将它加入一个容器中(adding it to a container)
3. 信号连接(Signal Connection):接收信号以及进行动作(the action it will perform)
4. 显示(Display):它是否是可见的(whether it is viewable or not)
5. 删除(Destruction):关闭程序(closing of a program)
2.3 Container(s)
Container是一个可以包含其它widget的widget。大部分的widget都是container,例如:GtkWindow、GtkTable和GtkBox。除了这点之外,container跟其它的widget没两样,也可以被放到其它container去。而所有的container都是来自于一个class─GtkContainer,本身来自于GtkWidget的class。所以container也是widget的一种。
2.4 Signal(s)
当程序设计师在程序中做了一个动作时,程序需要有一个动作来回应使用者的动作。Signals使程序可以知道使用者做了动作并可以触发适合的回应。
例如,当使用者按了一个可以开新视窗的按钮(GtkButton),程序认出这个请求,于是就开了一个新的视窗。这件事可以经由signal来做到。当按钮按下去之后,会使widget发出一个signal,接着再由该signal触发callbacks,产生一个新的视窗(GtkWindow)。
2.5 Callback(s)
Callback就是当signal送出之后,被signal唤起的function。Callback会执行function传回一个值或是做一个动作。Callback就是signal的handler funciton。它可以是该signal的预设handler或着是程序设计师定义的function。要建立一个callback,就必须把function connect 到 signal。
2.6 Signal Inheritance(继承)
和methods一样,signals可以被对象继承。一个widget可以送出任何它的parent widget可以送出的还有它自己特有的signal。
2.7 Connecting Signals
你必须为PHP-GTK指定一个callback function当signal送出时来对signal做回应。把一个signal连接到一个function可以用connect() 这个object 方法达成。
如下:
connect("destroy", "shutdown");
//建立一个GtkButton,按钮文字为"按我"
$button = &new GtkButton("按我");
$button->connect("clicked", "you_clicked");
//把GtkButton放到是container的GtkWindow中
$window->add($button);
//显示$window以及它的所有child widget
$window->show_all();
//进入程序主回圈(即程序启动之意)
gtk::main();
?>
执行它的话,就会出现一个视窗,里面有一个写着"按我"的按钮,按下按钮程序就会执行you_clicked函式。在这个程序中,$window对象的"destroy" signal是在使用者按下视窗右上角的"X"时会送出的;而$button对象的"clicked" signal是在使用者按下该按钮的时候会送出的。最后那一行的gtk::main() 是一定要执行的,这样才能告诉电脑要开始执行程序,既然有开始执行,那就一定有停止吧? 没错,用gtk::main_quit() 就可以停止程序了。
看完了以上的范例,有些读者可能会有疑问「如果我想执行送出signal的widget之外的widget的method怎么办?」,这时候,就要用另一个method了 a connect_object(),它可以跨对象呼叫方法或是传递其它对象做为function的叁数。跨对象呼叫方法如下:
$window->connect_object("destroy", array("gtk","main_quit"))
如此,在$window对象的"destroy" signal送出的时候就会唤起gtk::main_quit()这个方法,程序就会终指执行。
在介绍连接方法的最后,再提一下connect() 和 connect_object() 的自订增加要传给callback function的叁数的办法。见例子:
$parameter="新超人";
$button1 = &new GtkButton("测试");
//将"clicked" signal连接到who_are_you函式,附加叁数$parameter
$button1->connect("clicked","who_are_you",$parameter);
$button2 = &new GtkButton("测试二");
//将"clicked" signal连接到kill_the_button1函式,附加叁数$button1
$button2->connect_object("clicked","kill_the_button1",$button1);
function who_are_you($widget,$parameter){
echo $parameter;
}
function kill_the_button($button){
$button->destroy();
}
?>
注意那两个function,who_are_you有两个叁数对吧? 第一个是做什么用的呢?为什么它会自动出现?? 因为,每个signal的callback function都会因为signal的不同而加上一些内定一定会传入callback function的叁数,而基本上所有的signal都至少会传给callback function一个叁数a产生该signal的物件。所以who_are_you的第一个叁数就是$button1,而第二个就是$parameter,也就是新超人。那kill_the_button函式就不一样罗~ 因为connect_object()函式会呼略原本signal的callback function的预设叁数,所以kill_the_button就只有附加在connect_object最后的$button1叁数了,如此,kill_the_button就可以呼叫$button1的方法或是取得它的属性,这里呼叫了$button1的destroy方法,于是$button1就会被消灭。
2.8 Event(s)
Event是signal的一种,但是它的用途还有功能都非常强大。就signal来说,signal这种东西都是内建在widget上的,所以,例如GtkWindow没有"clicked"signal,那么在不用event signal的情况下,GtkWindow是决对不可能送出clicked之类的signal的。那如果用了event signal呢? Event signal是可以允许被加到任何的widget上的,所以就算这个widget本来没有发出"clicked"signal的功能,你也可以用add_events() 来为它加上按了它之后event signal会做什么样的反应。而event signal中包含的资讯比较多,比如说当你在使用"key-press-event"这个event signal的时候,同时也会记录到你按下的是什么按键,于是通常event signal的callback function格式内定会有两个叁数,第一个依然是送出signal的widget,而第二个就是$event,这个$event是一个class,里面的属性和方法会因为送过来的event signal种类而不同。就"key-press-event"传回的$event class来说,里面有一个属性是keyval,内容就是使用者按的是哪一个键。这些对于一个程序设计师来说常常是很有用的资讯。所以event的重要性是不可忽视的,就算刚开始会有点不懂,也要慢慢的融入才行。这一节也非常重要。
3. 安装PHP-GTK
3.1 在Windows系统下安装
首先要从http://gtk.php.net/download.php下载...HP-GTK的windows binary档案(本文撰写时为0.5.1版)。
接着来看看PHP-GTK 0.5.1 binary档的内容:
\php4 → php 和 php-gtk binary 档案
\winnt → 预设的php.ini档案
\winnt\system32 → gtk binaries used by extension
\test → 几个测试用的档案
\README.txt → 安装说明档
开始安装:
1. 复制 \php4 的内容到你的php安装目录下(例C:\php)。
2. 复制 \winnt 的内容到你的winnt资料夹。在Windows NT或Windows2000上是C:\winnt,在Window95、98、xp上是C:\windows。如果该资料夹里已经有 php.ini,那就不用做这个动作。
3. 复制 \winnt\system32 的内容到你的winnt\system32资料夹。在Windows NT或Windows2000上是C:\winnt\system32,在Window95、98、xp上是C:\windows\system32。
4. 复制 \test 的内容到你想要执行你的script的地方(此步骤非必要)。
如何执行PHP-GTK程序:
PHP-GTK程序可以在「开始」-「执行」下输入指令(或是建立捷径)来启动,如:C:\php\php -q c:\php\test\gtk.php ## 表示不送印出 HTTP Header,但一直使用这个视窗,直到关闭程序。
C:\php\php -q -c php.ini c:\gtk.php ## 同上,但执行指定的php.ini设定。
C:\php\php C:\php\tes