乳房太大必要时要缩小_美美生活馆

PHP+GTK入门

08月 31st, 2008 by Skylin

以前PHP被认为只能用来编写服务器端的CGI程序,如果说PHP能够开发Windows下的GUI(图形用户界面)程序,你相信吗?最近,PHP的开发小组成功开发出了捆绑GTK+的PHP,那么就可以开发Windows下的GUI程序了。 
 
一、建立PHP/GTK运行环境: 
其实GUI程序和普通的PHPCGI程序没有什么区别,不过是PHP/GTK程序由GTK的类来生成GUI界面而已,他们同样是开放源代码,靠PHP来解析建立窗口。如果你已经建立好了PHP的调试环境,那么安装PHP/GTK环境比较简单: 
1、下载php_gtk.dll(这个dll文件用于解析PHP源程序里面的GTK代码),下载后将其解压到PHP的扩展(extension)目录中; 
2、下载其他PHP/GTK的dll文件(一共6个),将他们解压缩到Windows的system32目录里面; 
3、打开php.ini,在扩展设置部分“Windows Extensions”最下面加入“extension=php_gtk.dll”的语句,建议先备份php.ini,避免修改失败使得建立好的PHP运行环境作废; 
现在就建立好了PHP/GTK的运行环境了。当然,你也可以不作第二步,而改为在每个PHP/GTK程序源代码的第一行加入“dl(’php_gtk.dll’)”来动态加载GTK的支持。 
如果你还没有建立PHP运行环境,那么安装要更加简单: 
1、下载整个PHP/GTK的捆绑支持包,然后将他们解压缩到c盘的PHP4目录下面; 
2、将winnt目录下面的dll文件拷贝到Windows的system32目录中,将php.ini文件拷贝到Windows的目录中; 
建 立好了PHP/GTK的运行后,可以用命令行模式的PHP来运行一个PHP/GTK程序:在运行中输入“c:\php4\php -q gtkprogrampath”,其中“c:\php4\php”改为PHP.EXE的路径,“gtkprogrampath”就是PHP/GTK程序的 路径。比如:“c:\php4\php -q c:\php4\samples\hello.php”将会运行PHP/GTK运行包中附带的例子“hello world”程序。 
 
二、编译PHP/GTK程序: 
如果你作出一个PHP/GTK的应用程序,还需要对方的电脑建立PHP的运行环境并且使用PHP命令行模式来解析才可以执行的话,那就过于复杂了。那么怎么样才可以编译一个PHP/GTK的程序呢?经过一番搜索,笔者发现了PHPCompiler这个软件。 
PHPCompiler由
www.deskcode.com开发http://www.deskcode.com/phpcompiler),可以将PHP编译成为EXE可执行文件,内置了PHP的支持,如果你要编译一个PHP/GTK程序,必须建立PHP/GTK的运行环境(参照前面的步骤)。要编译一个PHP/GTK程序的步骤如下: 
1、打开PHPCompiler,在“Script to”选择希望编译的PHP程序源代码,在“Destination”处选择编译成功后的EXE文件的路径; 
2、点击“Compile”按钮,会弹出一个对话框询问使用的编译模式(如果是PHP/GTK程序就选择no,是单纯的PHPCGI程序就选择yes); 
3、然后又会弹出一个对话框询问是否拷贝php4ts.dll文件到编译后的EXE文件的目录,选择yes。 
经过上面的步骤,一个PHP/GTK程序就成功编译了,但是对于编译PHP/GTK程序还有几个需要注意的地方: 
1、编译完成后的可执行文件如果需要执行,PC机上面必须具有GTK运行环境所需的几个dll文件(就是前面下载的那几个),如果需要作成应用程序,可以在安装的时候将几个dll文件拷贝到system32目录中(不过这样子程序也就不是“绿色软件”了^_^)。 
2、 PHPCompiler本身对于PHP的支持非常好,但是有些人试过用一些需要扩展支持的函数,比如“gzopen”等等,在编译之前还好好的,编译完毕 后就不能用了。其实编译完成后的可执行文件,相当于了只有默认的PHP支持(连GTK支持都没有了),所以如果在程序中应用了任何需要扩展支持的函数,都 必须动态的加载支持函数的dll文件,比如“dl(’php_gtk.dll’)”,这样子编译完成后才不会出错。 
3、运行一个编译后的可执行文件,都会先弹出一个DOS窗口,然后自动关闭,因为每个GUI窗口都是通过GTK来“绘制”出来的,所以必须会有那个窗口。 
4、或许以前PHP还不能说是真正的OOP(面向对象程序)语言,但是到了PHP/GTK,任何一个窗口都由GTK对象来“绘制”,如果没有过硬的OOP功底,是很难写出GUI程序的。 
 
三、PHP/GTK资源: 
1、
http://gtk.php.net:PHP/GTK的官方网站;虽然说是官方网站,但是确简陋的很,出了一个FAQ和邮件列表,几乎找不到任何有用的东西了, 
2、
http://www.phpgtk.com一个界面比较好的PHP/GTK网站,有最新的版本信息。 
3、
http://developer.gnome.org/doc/API/gtk/gtkobjects.htmlPHP/GTK函数和类的大全/手册网站,里面有十分丰富的PHP/GTK资料。 
4、
http://www.phpuk.org/gtk/非官方版本的GTK手册网站,简单易懂。 
 
如果大家认为E文比较难看,也可以来zphp.com[url]http://dl.itbulo.com/’[/url]>下载最新的PHP/GTK运行环境和支持包。
 
 

PHP-GTK开发入门全集(1) 
 
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 GtkTableGtkBox。除了这点之外,container跟其它的widget没两样,也可以被放到其它container去。而所有的 container都是来自于一个class─GtkContainer,本身来自于GtkWidgetclass。所以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就是signa
lhandler funciton。它可以是该signal的预设handler或着是程序设计师定义的function。要建立一个callback,就必须把 function connect signal。 
 
2.6 Signal Inheritance(继承) 
和methods一样,signals可以被对象继承。一个widget可以送出任何它的parent widget可以送出的还有它自己特有的signal。 
 
2.7 Connecting Signals 
你必须为PHP-GTK指定一个callbac
k functionsignal送出时来对signal做回应。把一个signal连接到一个function可以用connect() 这个object 方法达成。 
 
如下:

 

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

执行它的话,就会出现一个视窗,里面有一个写着"按我"的按钮,按下按钮程序就会执行you_clicked函式。在这个程序中,$window对象的 "destroy" signal是在使用者按下视窗右上角的"X"时会送出的;而$button对象的"clicked" signal是在使用者按下该按钮的时候会送出的。最后那一行的gtk::main() 是一定要执行的,这样才能告诉电脑要开始执行程序,既然有开始执行,那就一定有停止吧? 没错,用gtk::main_quit() 就可以停止程序了。 
 
看完了以上的范例,有些读者可能会有疑问「如果我想执行送出signal的widget之外的widget的meth
od怎么办?」,这时候,就要用另一 method a connect_object()它可以跨对象呼叫方法或是传递其它对象做为function的叁数。跨对象呼叫方法如下: 
 
$window->connect_object("destroy", array("gtk","main_quit")) 
 
如此,在$window对象的"destroy" signal送出的时候就会唤起gtk::main_quit()这个方法,程序就会终指执行。 
 
在介绍连接方法的最后,再提一下connect() 和 connec
t_object() 的自订增加要传给callback function的叁数的办法。见例子:

 

 
  1. $parameter="新超人";   
  2. $button1 = &new GtkButton("测试");   
  3. //将"clicked" signal连接到who_are_you函式,附加叁数$parameter   
  4. $button1->connect("clicked","who_are_you",$parameter);   
  5. $button2 = &new GtkButton("测试二");   
  6. //将"clicked" signal连接到kill_the_button1函式,附加叁数$button1   
  7. $button2->connect_object("clicked","kill_the_button1",$button1);   
  8.    
  9. function who_are_you($widget,$parameter){   
  10. echo $parameter;   
  11. }   
  12.    
  13. function kill_the_button($button){   
  14. $button->destroy();   
  15. }   
  16. ?>   

注意那两个function,who_are_you有两个叁数对? 第一个是做什么用的呢?为什么它会自动出现?? 因为,每个signalcallback function都会因为signal的不同而加上一些内定一定会传入callback function的叁数,而基本上所有的signal都至少会传callback function一个叁数a产生该signal的物件。所以who_are_you的第一个叁数就是$button1而第二个就是$ parameter,也就是新超人。那kill_the_button函式就不一样罗~ 因为connect_object()函式会呼略原本signalcallback function的预设叁数,所以kill_the_button就只有附加在connect_object最后的$button1叁数了,如此, kill_the_button就可以呼叫$button1的方法或是取得它的属性,这里呼叫了$button1destroy方法,于是$ 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 signalcallback function格式内定会有两个叁数,第一个依然是送出signalwidget,而第二个就是$event,这个$event是一个class,里 面的属性和方法会因为送过来的event signal种类而不同。就"key-press-event"传回的$event class来说,里面有一个属性是keyval内容就是使用者按的是哪一个键。这些对于一个程序设计师来说常常是很有用的资讯。所以event的重要性 是不可忽视的,就算刚开始会有点不懂,也要慢慢的融入才行。这一节也非常重要。 
 

PHP-GTK开发入门全集(2) 
 
3. 安装PHP-GTK 
3.1 在Windows系统下安装 
首先要从
http://gtk.php.net/download.php下载…HP-GTKwindows binary档案(本文撰写时为0.5.1)。 
 
接着来看看PHP-GTK 0.5.1 binary档的内容: 
\php4 → php 和 php-gtk binary 档案 
\w
innt → 预设的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.i
ni,那就不用做这个动作。 
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\test\gtk.php ## 表示会送印出 HTTP Header,但一直使 
用这个视窗,直到关闭程序 
C:\php\php_win C:\php\test\gtk.php ## 表示不使用视窗,执行后独立一个执行程序,他是使用 php -q模式,但是只要
output出任何字符,例如错误讯息,就会停止执行。 
 
3.2 在UNIX系统下安装 
Debian的使用者可以在
http://www.debian.org 下载PHP-GTKbinary档。系统需求须已安装下列package: 
 
PHP 4.1.0 或之后的版本,必须是编为CGI binary(command-line) 版本,包含所有的header files和devlement scri
pts。 
 
PHP-GTK支持GTK+ v1.2而需要安装1.2.6以上版本的GTK+。GTK+ v2.0还未被支持,必须等到它开发完成并且普及了之后才会被支持。你可以从下面的网址取得GTK+ v1.2.X的最新版本:
ftp://ftp.gtk.org/pub/gtk/v1.2/ 
 
在将取得的档案解压缩或是由CVScheck out出来之后,切换到该目录下,开始进行安装(打指令罗~) 
 
取得CVS版本,执行 
cvs -d server:cvsread@cvs.php.net:/repository co php-gtk 
或下载最新版本 
http://gtk.php.net/download.php 
 
1. ./buildconf 
2. ./configure (想要加装extensions的话请输任./configure –help看说明) 
3. make(如果看到"Could not write
",只是代表该GTK+ object还没被支持,不算是什么错误讯息
4. make install 
 
执行看看test/资料夹中的范例scripts来测试,特别是gtk.php,这些都是展示如何使用的好例子。 
 
4. 第一支程序 
4.1 前言 
本章会教导各位一些常用的GtkClass(widget),还有运用这些来做出你的第一支PHP-GTK程序,如果概念那章不是很熟的话,这章可以给你一个练习的机会喔! 如果对本章的内容有不懂或是想要深入了解其它的widget,可以到
http://gtk.php.net/manual/en/ 看手册,手册里面有不少范例程序。 
 
4.2 会用到的widgets 
在开始写程序之前,先来对等一下会用到的widget class们做一个overview。 
 
GtkWindow() 
GtkWindow()建立一个视窗,里面有很多方法可以使用,如:set_title,set_name, 
connect,set_border_width等┅。
 
 
GtkFrame() 
GtkFrame()纯粹建立一个好Border,你可以设定它的label name,alignment, 
shadow(用英文,读Manual的时候会比较方便)。 
GtkVBox() 
GtkVBox()建立一个直立的container来放入widgets。 
 
GtkLabel() 
GtkLabel()可以建立一个label,内容文字可以建立时设定也可以建立后用方法来设定,如果没有设定内容文字,将会建立一个空的label(这是废话吗
?)。 
 
GtkHSeparator() 
GtkH
separator()建立一个水平线。 
 
GtkEntry() 
GtkEntry()建立一个textbox供使用者输入资讯。 
 
GtkHButtonBox() 
GtkHButtonBox()建立一个以水平方式排列Button的container。 
 
GktBtton() 
GtkButton()或许可以说是GUI程序中最常用的widget了,它建立一个可以让使用者按的按钮。

4.3 开始

 

 
  1. If(!class_exist("gtk"))   
  2. {   
  3. dl("php_gtk.".(strstr(PHP_OS,"WIN") ? "dll" : "so"));   
  4. }   

 

这段程序码会判断PHP-GTK延伸模组是否已启动,如果没有,它就会读取适当的档案。在上面的范例中,是靠判断执行的作业系统是Windows还是其它来判断要载入php_gtk.dll还是php_gtk.so

 

 
  1. Function delete_event()   
  2. {   
  3. return false;   
  4. }   

 

这里建立了一个名为delete_event的function,这个function是等会儿delete-event signal发出时的callback function。内容传回false会告诉PHP-GTK用预设的signal handler来处理,而预设的handler会关闭视窗(同时会呼叫该视窗的destroy() 函式),在这里,它会关闭程序(因为这个范例程序只有一个主视窗,一旦关闭就会关闭程序)

 

 
  1. Function destroy()   
  2. {   
  3. Gtk::main_quit();   
  4. }   

 

这里建立了一个函式,destroy()。在这个程序中,这个函式是很重要的,因为我们在关闭程序的时候会连接到它。之前说过,Gtk:: main_quit()会关闭程序,如果我们在这个程序中没有定义这个function或是这个function里面没有Gtk::main_quit ()这行,那么这个程序就不会关闭了。以上一段程序码说明里提到的delete-event来说,return false之后预设会执行关闭视窗的动作,还会呼叫destroy()函式,如果这里没有定义或是没有Gtk::main_quit()这段的话,主视窗 的确会关闭,可是程序并不会结束,因为主程序回圈aGtk::main()还在跑。

 
  1. $window = &new GtkWindow();   
  2. //设定名字以辨别各个视窗   
  3. $window->set_name(‘main window’);   
  4. //设定视窗的标题   
  5. $window->set_title(‘对PHP-GTK的介绍’);   
  6. //设定视窗的大小   
  7. $window->set_usize(160, 120);   
  8. //呼叫destroy()函式来结束程序   
  9. $window->connect(‘destroy’‘destroy’);   
  10. //呼叫delete_event()函式来关闭视窗   
  11. $window->connect(‘delete-event’‘delete_event’);   
  12. //设定视窗的边框宽度   
  13. $window->set_border_width(10);   
  14. //设定视窗的位置   
  15. $window->set_position(GTK_WIN_POS_CENTER);   
  16. //显示视窗和所有child widget (不显示就看不到)   
  17. //最后这两行一定要放在程序码的最后,否则什么都看不到   
  18. $window->show_all();   
  19. Gtk::main();   
  20. ?>   

执行程序可以看到如下的图:

 
  1. //建立一个GtkFrame   
  2. $frame" = &new GtkFrame(‘经过简易修改的程序’);   
  3. //把GtkFrame放到GtkWindow里   
  4. $window->add($frame);   
  5. //最下面两行不要动   

结果如下图:

下面这段建立一个GtkVBox作为container,并把GtkEntryGtkHSeperatorGtkLabel GtkButtonBoxpack进去,所谓pack,是GtkBox底下的container们特别加入的放入widget的方法,就类似于add (),而pack用的方法一般是pack_start()pack_end(),比add()好的地方是可以控制将widget增加进去之后 widget的位置(不过只要是container就会有add()方法),欲查询详细资料请至 
http://gtk.php.net/manual/en

 
  1. //建立一个GtkVBox,为常用的container   
  2. $box1" = &new GtkVBox();   
  3. //把GtkVBox放到GtkFrame里面   
  4. $frame->add($box1);   
  5. //建立一个GtkLabel并将它pack到GtkVBox里   
  6. $label = &new GtkLabel();   
  7. $box1->pack_start($label);   
  8. //建立一个GtkHSeparator并将它pack到GtkVBox里   
  9. $separator = &new GtkHSeparator();   
  10. $box1->pack_start($separator);   
  11. //建立一个GtkEntry并将它pack到GtkVBox里   
  12. $entry = &new GtkEntry();   
  13. $box1->pack_start($entry);   
  14. //建立一个GtkButtonBox并将它add到GtkVBox里   
  15. //因为GtkButtonBox也是一个无形的container,位置不重要,所以用add()   
  16. $box2 = &new GtkHButtonBox();   
  17. $box1->add($box2);   

执行如下图:

最后这段程序码会建立两个GtkButtonpackGtkButtonBox里去,还有为两个按钮加上连接,使它们起作用,并建立一个函式,只要按下GtkButton就会GtkLabel的内容换成GtkEntry中的文字。

 
  1. $button" = &new GtkButton(‘显示输入的字’);   
  2. //连接"clicked" signal到set_name()函式,附加$label和$entry两个widget   
  3. $button->connect_object(‘clicked’,’set_name’,$label,$entry);   
  4. $box2->pack_start($button);   
  5. $button = &new GtkButton(‘离开程序’);   
  6. //连接"clicked" signal到destroy()函式,将会关闭程序   
  7. $button->connect(‘clicked’,‘destroy’);   
  8. $box2->pack_start($button);   
  9.    
  10. function set_name($label,$entry)   
  11. {   
  12. //用GtkEntry的get_text()方法从取得文字方块内容   
  13. $gettext=$entry->get_text();   
  14. //用GtkLabel的set_text()方法设定新的文字   
  15. $label->set_text($gettext);   
  16. }   
  17. //最后再提一下那两行┅.   
  18. $window->show_all();   
  19. Gtk::main();   

写到这里,整个程序就算是完成了,来看看执行的结果吧~

Posted in PHP |

Leave a Comment