|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习数据库了,MYSQL可算是PHP的黄金搭档了,不过,虽然话是这么说,你也可能恨不得把MYSQL给生吞活剥了,因为这一行一列的东东简直让自己头晕目眩。 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 办法告竣。
以下:
<?php
//创立一个GtkWindow
$window = &new GtkWindow();
//将"destroy" signal用connect() 办法毗连到shutdown函式
$window->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的叁数的举措。见例子:
<?php
$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档案
winntsystem32 → 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. 复制 winntsystem32 的内容到你的winntsystem32材料夹。在Windows NT或Windows2000上是C:winntsystem32,在Window95、98、xp上是C:windowssystem32。
4. 复制 test 的内容到你想要履行你的script的中央(此步调非需要)。
若何履行PHP-GTK程式:
PHP-GTK程式可以在「入手下手」-「履行」下输出指令(或是创立捷径)来启动,如:C:phpphp -q c:phptestgtk.php ## 暗示不送印出 HTTP Header,但一向利用这个视窗,直到封闭程式。
C:phpphp -q -c php.ini c:gtk.php ## 同上,但履行指定的php.ini设定。
C:phpphp C:phptestgtk.php ## 暗示会送印出 HTTP Header,但一向使
用这个视窗,直到封闭法式
C:phpphp_win C:phptestgtk.php ## 暗示不利用视窗,履行後自力一个履行程式,他是利用 php -q形式,然而只需output出任何字元,例如毛病讯息,就会中断履行。
3.2 在UNIX体系下装置
Debian的利用者可以在 http://www.debian.org 下载PHP-GTK的binary档。体系需求须已装置以下package:
PHP 4.1.0 或之後的版本,必需是编为CGI binary(command-line) 版本,包括一切的header files和devlement scripts。
PHP-GTK增援GTK+ v1.2而需求装置1.2.6以上版本的GTK+。GTK+ v2.0还未被增援,必需比及它开辟完成而且普及了之後才会被增援。你可以从上面的网址获得GTK+ v1.2.X的最新版本:ftp://ftp.gtk.org/pub/gtk/v1.2/
在将获得的档案解紧缩或是由CVS中check 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()
GtkHseparator()创立一个程度线。
GtkEntry()
GtkEntry()创立一个textbox供利用者输出新闻。
GtkHButtonBox()
GtkHButtonBox()创立一个以程度体例分列Button的container。
GktBtton()
GtkButton()也许可以说是GUI程式中最经常使用的widget了,它创立一个可让利用者按的按钮。
4.3 入手下手
If(!class_exist("gtk"))
{
dl("php_gtk.".(strstr(PHP_OS,"WIN") ? "dll" : "so"));
}
这段程式码会判别PHP-GTK延长模组是不是已启动,假如没有,它就会读取恰当的档案。在下面的典范中,是靠判别履行的功课体系是Windows仍是其它来判别要载入php_gtk.dll仍是php_gtk.so。
Function delete_event()
{
return false;
}
这里创立了一个名为delete_event的function,这个function是等会儿delete-event signal收回时的callback function。内容传回false会告知PHP-GTK用预设的signal handler来处置,而预设的handler会封闭视窗(同时会呼唤该视窗的destroy() 函式),在这里,它会封闭程式(由于这个典范程式只要一个主视窗,一旦封闭就会封闭程式)。
Function destroy()
{
Gtk::main_quit();
}
这里创立了一个函式,destroy()。在这个程式中,这个函式是很主要的,由于咱们在封闭程式的时分会毗连到它。之前说过,Gtk::main_quit()会封闭程式,假如咱们在这个程式中没有界说这个function或是这个function外面没有Gtk::main_quit()这行,那末这个程式就不会封闭了。以上一段程式码申明里提到的delete-event来讲,return false之後预设会履行封闭视窗的举措,还会呼唤destroy()函式,假如这里没有界说或是没有Gtk::main_quit()这段的话,主视窗切实其实会封闭,可是程式其实不会停止,由于主程式回圈aGtk::main()还在跑。
<?php
$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();
?>
履行程式可以看到以下的图:
//创立一个GtkFrame
$frame = &new GtkFrame('经由简略单纯修正的程式');
//把GtkFrame放到GtkWindow里
$window->add($frame);
//最上面两行不要动
了局以下图:
上面这段创立一个GtkVBox作为container,并把GtkEntry、GtkHSeperator、GtkLabel和GtkButtonBox都pack出来,所谓pack,是GtkBox底下的container们出格到场的放入widget的办法,就相似於add(),而pack用的办法通常为pack_start()和pack_end(),比add()好的中央是可以掌握将widget增添出来之後widget的地位(不外只需是container就会有add()办法),欲查询具体材料请至
http://gtk.php.net/manual/en。
//创立一个GtkVBox,为经常使用的container
$box1 = &new GtkVBox();
//把GtkVBox放到GtkFrame外面
$frame->add($box1);
//创立一个GtkLabel并将它pack到GtkVBox里
$label = &new GtkLabel();
$box1->pack_start($label);
//创立一个GtkHSeparator并将它pack到GtkVBox里
$separator = &new GtkHSeparator();
$box1->pack_start($separator);
//创立一个GtkEntry并将它pack到GtkVBox里
$entry = &new GtkEntry();
$box1->pack_start($entry);
//创立一个GtkButtonBox并将它add到GtkVBox里
//由于GtkButtonBox也是一个有形的container,地位不主要,所以用add()
$box2 = &new GtkHButtonBox();
$box1->add($box2);
履行以下图:
最後这段程式码会创立两个GtkButton并pack到GtkButtonBox里去,还无为两个按钮加上毗连,使它们起感化,并创立一个函式,只需按下GtkButton就会将GtkLabel的内容换成GtkEntry中的文字。
$button = &new GtkButton('显示输出的字');
//毗连"clicked" signal到set_name()函式,附加$label和$entry两个widget
$button->connect_object('clicked','set_name',$label,$entry);
$box2->pack_start($button);
$button = &new GtkButton('分开程式');
//毗连"clicked" signal到destroy()函式,将会封闭程式
$button->connect('clicked','destroy');
$box2->pack_start($button);
function set_name($label,$entry)
{
//用GtkEntry的get_text()办法从获得文字方块内容
$gettext=$entry->get_text();
//用GtkLabel的set_text()办法设定新的文字
$label->set_text($gettext);
}
//最後再提一下那两行┅.
$window->show_all();
Gtk::main();
到@e,整程式就算是完成了,砜纯绦械慕Y果吧~
5. 其它
5.1 进一步进修
假如在停止了下面的课程以后你还想要更懂得PHP-GTK,或是关于本文的内容有任何
不分明的中央,这里供应你几个中央可以查询材料:
PHP-GTK官方网站(En): http://gtk.php.net
GTK官方网站(En): http://www.gtk.org
PHP-GTK官方网站上的Manual(En): http://gtk.php.net/manual/en
TIM官方网站(zh-Tw): http://tim.jerry.com.tw
5.2 另外一个典范
这里有一个笔者写的猜数字游戏,算是对照进阶的典范,可以抓归去研讨看看。
http://pc035860.infor.org/download/GuessNumber.zip
5.3 参考数据
本文次要是参考PHP-GTK官方Manual和Zend网站上的Tutorial而编撰成的:
http://gtk.php.net/manual/en
http://www.zend.com/zend/tut/tutorial-silva.php
不过语法好学,但是怎么用语法来实现每个人都有每个人的方式,几乎是各有千秋。然而借鉴别人成功的代码,绝对是有益无害,因此,多看那些经过千锤百炼凝出来的经典代码,是进阶的最好方法。 |
|