GTK+ 2.0 指南

什么是 PHP-GTK?

PHP-GTK是为了证明PHP是一种远远超越网络应用程序的有效的工具而开发的。使用PHP-GTK你可以建立独立的GUI(用户图形界面)应用程序,例如mp3播放器、文本编辑器、数据库后台等等。PHP-GTK是PHP的扩展,可以从 http://gtk.php.net下载。PHP-GTK基于GTK+,是Andrei Zmievski最先使用的。

什么是GTK+?

GTK+(GIMP工具包)为了GNU图象操作程序(简称GIMP)而开发的的。GTK+发展迅速,现在已经成为GNU桌面环境项目的一个组成部分(Gnome)。实际上,GTK+是一组C语言库:GTK,GDK和Glib。建立跨平台应用程序的易用性是PHP-GTK流行起来的一个重要原因。如果你是Windows程序员,也不要心急,因为Windows平台的GTK(和PHP-GTK)也已经可用使用。 基本上说,GTK+和PHP-GTK是使用窗口部件来建立用户图形界面(GUI)应用程序的工具;GUI是一组与用户交互的应用程序补充部分的窗口部件,无论是按钮、文本框等,它们都是GUI的组成部分;窗口部件是组成GUI的一个单独的对象,通常来说,窗口部件是滚动条、文本框、按钮和菜单,实际上,窗口本身就是窗口部件的对象。 应用实例:有许多数据库应用程序使用了PHP-GTK,最著名的可能要数AgataReport( http://agata.codigolivre.org.br/)?..皃hpgtklife”和 "cow puzzle"的游戏还在开发中。从mp3播放器到成熟的IRC客户端都可以使用PHP-GTK开发。这些例子多不胜举,而且可以跨平台开发。

如何在 win32 下面安装 PHP_GTK?

从这个地址下载 二进制 程序。 http://gtk.php.net/do_download.php?...0.0.2-win32.zip

不能下载,自己到 HTTP://GTK.PHP.NET的DOWNLOAD里找
压缩文件里面包括了所需要的所有文件,根据下面提示,复制到各个路径!

On Windows 98/NT/2000 you will need these files

这些系统复制到 PHP 的目录下

[php-directory] (c hp4)

php.exe
php4ts.dll
php_gtk.dll

[Windows directory] (c:winnt or c:windows)

复制到系统目录下

php.ini

[System32 directory] (c:winntsystem32 or c:windowssystem32)

复制到系统库的目录下

gtk-1.3.dll
gdk-1.3.dll
gmodule-1.3.dll
glib-1.3.dll
iconv-1.3.dll
gnu-intl.dll
php-gtk has NOT been tested on Windows 95/98

如何知道支持哪个 GTK 类?

下面的代码将显示定义的类。

$array = get_declared_classes();

1<br/>

while(list(, $classname) = each( $array)) {

1<br/>

echo $classname."n";

1<br/>

}

PHP-GTK Reference

http://gtk.php.net/manual/en/reference.php

为了PHP的开花结果,不来点猛地不行啦
转贴如下(本教程来源于网络,如有侵犯你的权利,请及时与我联系,深为极品菜鸟的我一定第一时间删除^_^),LOOK

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 方法达成。

如下:

 1   
 2//建立一个GtkWindow   
 3$window = &new GtkWindow();   
 4//将"destroy" signal用connect() 方法连接到shutdown函式   
 5$window->connect("destroy", "shutdown");   
 6//建立一个GtkButton,按钮文字为"按我"   
 7$button = &new GtkButton("按我");   
 8$button->connect("clicked", "you_clicked");   
 9//把GtkButton放到是container的GtkWindow中   
10$window->add( $button);   
11//显示 $window以及它的所有child widget   
12$window->show_all();   
13//进入程式主回圈(即程式启动之意)   
14gtk::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的叁数的办法。见例子:
[/pre]```

$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();
}

  1  
  2  
  3注意那两个function,who_are_you有两个叁数对吧? 第一个是做什么用的呢?为什   
  4么它会自动出现?? 因为,每个signal的callback function都会因为signal的不同   
  5而加上一些内定一定会传入callback function的叁数,而基本上所有的signal都至   
  6少会传给callback function一个叁数a产生该signal的物件。所以who_are_you的第   
  7一个叁数就是 $button1,而第二个就是 $parameter,也就是新超人。那   
  8kill_the_button函式就不一样罗~ 因为connect_object()函式会呼略原本signal   
  9的callback function的预设叁数,所以kill_the_button就只有附加在   
 10connect_object最後的 $button1叁数了,如此,kill_the_button就可以呼叫   
 11$button1的方法或是取得它的属性,这里呼叫了 $button1的destroy方法,於是   
 12$button1就会被消灭。   
 13  
 142.8 Event(s)   
 15Event是signal的一种,但是它的用途还有功能都非常强大。就signal来说,signal   
 16这种东西都是内建在widget上的,所以,例如GtkWindow没有"clicked"signal,那   
 17么在不用event signal的情况下,GtkWindow是决对不可能送出clicked之类的   
 18signal的。那如果用了event signal呢? Event signal是可以允许被加到任何的   
 19widget上的,所以就算这个widget本来没有发出"clicked"signal的功能,你也可以   
 20用add_events() 来为它加上按了它之後event signal会做什么样的反应。而   
 21event signal中包含的资讯比较多,比如说当你在使用"key-press-event"这个   
 22event signal的时候,同时也会记录到你按下的是什么按键,於是通常   
 23event signal的callback function格式内定会有两个叁数,第一个依然是送出   
 24signal的widget,而第二个就是 $event,这个 $event是一个class,里面的属性和   
 25方法会因为送过来的event signal种类而不同。就"key-press-event"传回的   
 26$event class来说,里面有一个属性是keyval,内容就是使用者按的是哪一个键。   
 27这些对於一个程式设计师来说常常是很有用的资讯。所以event的重要性是不可忽   
 28视的,就算刚开始会有点不懂,也要慢慢的融入才行。这一节也非常重要。   
 29  
 303\. 安装PHP-GTK   
 31  
 323.1 在Windows系统下安装   
 33首先要从  http://gtk.php.net/download.php下载...HP-GTK的windows  binary   
 34档案(本文撰写时为0.5.1版)。   
 35  
 36接着来看看PHP-GTK 0.5.1 binary档的内容:   
 37\php4 → php 和 php-gtk binary 档案   
 38\winnt → 预设的php.ini档案   
 39\winnt\system32 → gtk binaries used by extension   
 40\test → 几个测试用的档案   
 41\README.txt → 安装说明档   
 42  
 43开始安装:   
 441\. 复制 \php4 的内容到你的php安装目录下(例C:\php)。   
 452\. 复制 \winnt 的内容到你的winnt资料夹。在Windows NT或Windows2000上是   
 46C:\winnt,在Window95、98、xp上是C:\windows。如果该资料夹里已经有   
 47php.ini,那就不用做这个动作。   
 483\. 复制 \winnt\system32 的内容到你的winnt\system32资料夹。在Windows NT或   
 49Windows2000上是C:\winnt\system32,在Window95、98、xp上是   
 50C:\windows\system32。   
 514\. 复制 \test 的内容到你想要执行你的script的地方(此步骤非必要)。   
 52  
 53如何执行PHP-GTK程式:   
 54PHP-GTK程式可以在「开始」-「执行」下输入指令(或是建立捷径)来启动,如:   
 55C:\php\php -q c:\php\test\gtk.php ## 表示不送印出 HTTP Header,但一直使   
 56用这个视窗,直到关闭程式。   
 57C:\php\php -q -c php.ini c:\gtk.php ## 同上,但执行指定的php.ini设定。   
 58C:\php\php C:\php\test\gtk.php ## 表示会送印出 HTTP Header,但一直使   
 59用这个视窗,直到关闭程式。   
 60C:\php\php_win C:\php\test\gtk.php ## 表示不使用视窗,执行後独立一个执行   
 61程式,他是使用 php -q模式,但是只   
 62要output出任何字元,例如错误讯息,   
 63就会停止执行。   
 64  
 653.2 在UNIX系统下安装   
 66Debian的使用者可以在  http://www.debian.org下载PHP-GTK的binary档。    
 67系统需求须已安装下列package:   
 68  
 69PHP 4.1.0 或之後的版本,必须是编为CGI binary(command-line) 版本,包含所有   
 70的header files和devlement scripts。   
 71  
 72PHP-GTK支援GTK+ v1.2而需要安装1.2.6以上版本的GTK+。GTK+ v2.0还未被支援,   
 73必须等到它开发完成并且普及了之後才会被支援。你可以从下面的网址取得   
 74GTK+ v1.2.X的最新版本:  ftp://ftp.gtk.org/pub/gtk/v1.2/    
 75  
 76在将取得的档案解压缩或是由CVS中check out出来之後,切换到该目录下,开始进   
 77行安装(打指令罗~):   
 78  
 79取得CVS版本,执行   
 80cvs -d ![](http://www.phpx.com/happy/images/smilies/tongue.gif) server:[email protected]:/repository co php-gtk   
 81或下载最新版本   
 82http://gtk.php.net/download.php    
 83  
 841\. ./buildconf   
 852\. ./configure (想要加装extensions的话请输任./configure --help看说明)   
 863\. make(如果看到"Could not write┅",只是代表该GTK+ object还没被支援,不算是什么错误讯息)   
 874\. make install   
 88  
 89执行看看test/资料夹中的范例scripts来测试,特别是gtk.php,这些都是展示如何   
 90使用的好例子。   
 91  
 924\. 第一支程式   
 93  
 944.1 前言   
 95本章会教导各位一些常用的GtkClass(widget),还有运用这些来做出你的第一支   
 96PHP-GTK程式,如果概念那章不是很熟的话,这章可以给你一个练习的机会喔! 如果   
 97对本章的内容有不懂或是想要深入了解其他的widget,可以到   
 98http://gtk.php.net/manual/en/  看手册,手册里面有不少范例程式。   
 99  
1004.2 会用到的widgets   
101在开始写程式之前,先来对等一下会用到的widget class们做一个overview。   
102  
103GtkWindow()   
104GtkWindow()建立一个视窗,里面有很多方法可以使用,如:set_title,set_name,   
105connect,set_border_width等┅。   
106  
107GtkFrame()   
108GtkFrame()纯粹建立一个好Border,你可以设定它的label name,alignment,   
109shadow(用英文,读Manual的时候会比较方便)。   
110  
111GtkVBox()   
112GtkVBox()建立一个直立的container来放入widgets。   
113  
114GtkLabel()   
115GtkLabel()可以建立一个label,内容文字可以建立时设定也可以建立後用方法来设   
116定,如果没有设定内容文字,将会建立一个空的label(这是废话吗┅?)。   
117  
118GtkHSeparator()   
119GtkHseparator()建立一个水平线。   
120  
121GtkEntry()   
122GtkEntry()建立一个textbox供使用者输入资讯。   
123  
124GtkHButtonBox()   
125GtkHButtonBox()建立一个以水平方式排列Button的container。   
126  
127GktBtton()   
128GtkButton()或许可以说是GUI程式中最常用的widget了,它建立一个可以让使用者   
129按的按钮。   
130  
1314.3 开始   
132  
133If(!class_exist("gtk"))   
134{   
135dl("php_gtk.".(strstr(PHP_OS,"WIN") ? "dll" : "so"));   
136}   
137  
138这段程式码会判断PHP-GTK延伸模组是否已启动,如果没有,它就会读取适当的档案   
139。在上面的范例中,是靠判断执行的作业系统是Windows还是其它来判断要载入   
140php_gtk.dll还是php_gtk.so。   
141  
142  
143Function delete_event()   
144{   
145return false;   
146}   
147  
148这里建立了一个名为delete_event的function,这个function是等会儿   
149delete-event signal发出时的callback function。内容传回false会告诉PHP-GTK   
150用预设的signal handler来处理,而预设的handler会关闭视窗(同时会呼叫该视窗   
151的destroy() 函式),在这里,它会关闭程式(因为这个范例程式只有一个主视窗,   
152一旦关闭就会关闭程式)。   
153  
154Function destroy()   
155{   
156Gtk::main_quit();   
157}   
158  
159这里建立了一个函式,destroy()。在这个程式中,这个函式是很重要的,因为我们   
160在关闭程式的时候会连接到它。之前说过,Gtk::main_quit()会关闭程式,如果我   
161们在这个程式中没有定义这个function或是这个function里面没有   
162Gtk::main_quit()这行,那么这个程式就不会关闭了。以上一段程式码说明里提到   
163的delete-event来说,return false之後预设会执行关闭视窗的动作,还会呼叫   
164destroy()函式,如果这里没有定义或是没有Gtk::main_quit()这段的话,主视窗的   
165确会关闭,可是程式并不会结束,因为主程式回圈aGtk::main()还在跑。   
166  

$window = &new GtkWindow();
//设定名字以辨别各个视窗
$window->set_name('main window');
//设定视窗的标题
$window->set_title('对PHP-GTK的介绍');
//设定视窗的大小
$window->set_usize(160, 120);
//呼叫destroy()函式来结束程式
$window->connect('destroy', 'destroy');
//呼叫delete_event()函式来关闭视窗
$window->connect('delete-event', 'delete_event');
//设定视窗的边框宽度
$window->set_border_width(10);
//设定视窗的位置
$window->set_position(GTK_WIN_POS_CENTER);
//显示视窗和所有child widget (不显示就看不到)
//最後这两行一定要放在程式码的最後,否则什么都看不到
$window->show_all();
Gtk::main();

 1  
 2  
 3执行程式可以看到如下的图(下页):   
 4  
 5  
 6  
 7  
 8//建立一个GtkFrame   
 9$frame = &amp;new GtkFrame('经过简易修改的程式');   
10//把GtkFrame放到GtkWindow里   
11$window-&gt;add( $frame);   
12//最下面两行不要动   
13  
14  
15结果如下图:   
16  
17  
18  
19  
20下面这段建立一个GtkVBox作为container,并把GtkEntry、GtkHSeperator、   
21GtkLabel和GtkButtonBox都pack进去,所谓pack,是GtkBox底下的container们特别   
22加入的放入widget的方法,就类似於add(),而pack用的方法一般是pack_start()   
23和pack_end(),比add()好的地方是可以控制将widget增加进去之後widget的位置   
24(不过只要是container就会有add()方法),欲查询详细资料请至   
25http://gtk.php.net/manual/en。    
26  
27  
28//建立一个GtkVBox,为常用的container   
29$box1 = &amp;new GtkVBox();   
30//把GtkVBox放到GtkFrame里面   
31$frame-&gt;add( $box1);   
32//建立一个GtkLabel并将它pack到GtkVBox里   
33$label = &amp;new GtkLabel();   
34$box1-&gt;pack_start( $label);   
35//建立一个GtkHSeparator并将它pack到GtkVBox里   
36$separator = &amp;new GtkHSeparator();   
37$box1-&gt;pack_start( $separator);   
38//建立一个GtkEntry并将它pack到GtkVBox里   
39$entry = &amp;new GtkEntry();   
40$box1-&gt;pack_start( $entry);   
41//建立一个GtkButtonBox并将它add到GtkVBox里   
42//因为GtkButtonBox也是一个无形的container,位置不重要,所以用add()   
43$box2 = &amp;new GtkHButtonBox();   
44$box1-&gt;add( $box2);   
45  
46  
47  
48  
49执行如下图:   
50  
51  
52  
53  
54最後这段程式码会建立两个GtkButton并pack到GtkButtonBox里去,还有为两个按钮   
55加上连接,使它们起作用,并建立一个函式,只要按下GtkButton就会将GtkLabel的   
56内容换成GtkEntry中的文字。   
57  
58$button = &amp;new GtkButton('显示输入的字');   
59//连接"clicked" signal到set_name()函式,附加 $label和 $entry两个widget   
60$button-&gt;connect_object('clicked','set_name', $label, $entry);   
61$box2-&gt;pack_start( $button);   
62$button = &amp;new GtkButton('离开程式');   
63//连接"clicked" signal到destroy()函式,将会关闭程式   
64$button-&gt;connect('clicked','destroy');   
65$box2-&gt;pack_start( $button);   
66  
67function set_name( $label, $entry)   
68{   
69//用GtkEntry的get_text()方法从取得文字方块内容   
70$gettext= $entry-&gt;get_text();   
71//用GtkLabel的set_text()方法设定新的文字   
72$label-&gt;set_text( $gettext);   
73}   
74//最後再提一下那两行┅.   
75$window-&gt;show_all();   
76Gtk::main();
Published At
Categories with Web编程
Tagged with
comments powered by Disqus