仓酷云

标题: PHP网页编程之PHP-GTK 引见及其使用 [打印本页]

作者: 蒙在股里    时间: 2015-2-16 00:29
标题: PHP网页编程之PHP-GTK 引见及其使用
学习数据库了,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
  不过语法好学,但是怎么用语法来实现每个人都有每个人的方式,几乎是各有千秋。然而借鉴别人成功的代码,绝对是有益无害,因此,多看那些经过千锤百炼凝出来的经典代码,是进阶的最好方法。
作者: 不帅    时间: 2015-2-16 05:01
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者: 分手快乐    时间: 2015-3-5 00:00
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 海妖    时间: 2015-3-5 09:32
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
作者: 兰色精灵    时间: 2015-3-6 13:42
兴趣是最好的老师,百度是最好的词典。
作者: 冷月葬花魂    时间: 2015-3-13 01:09
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者: 简单生活    时间: 2015-3-13 05:09
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者: 再见西城    时间: 2015-3-20 13:33
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
作者: 莫相离    时间: 2015-3-22 22:09
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者: 金色的骷髅    时间: 2015-3-25 05:40
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 灵魂腐蚀    时间: 2015-4-6 00:10
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 愤怒的大鸟    时间: 2015-4-8 19:06
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者: 爱飞    时间: 2015-4-9 15:35
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
作者: 蒙在股里    时间: 2015-4-12 18:46
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
作者: 小妖女    时间: 2015-4-18 03:36
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
作者: 因胸联盟    时间: 2015-4-27 15:37
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
作者: 再现理想    时间: 2015-5-2 21:46
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
作者: 乐观    时间: 2015-5-12 04:51
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者: 变相怪杰    时间: 2015-6-7 23:24
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
作者: 小魔女    时间: 2015-6-10 23:44
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2