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的叁數??缥锛艚蟹椒ㄈ缦拢?br/>
$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();
?>
執行程式可以看到如下的圖:
500) this.width=500" vspace=10 border=0>
//建立一個GtkFrame
$frame = &new GtkFrame('經過簡易修改的程式');
//把GtkFrame放到GtkWindow里
$window->add($frame);
//最下面兩行不要動
結果如下圖:
500) this.width=500" vspace=10 border=0>
下面這段建立一個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);
執行如下圖:
500) this.width=500" vspace=10 border=0>
最後這段程式碼會建立兩個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();
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91麻豆国产精品|
欧美激情图片区|
欧美另类精品xxxx孕妇|
成人福利网站在线观看|
亚洲电影免费观看高清|
91在线视频一区|
26uuu另类亚洲欧美日本老年|
亚洲欧美日韩天堂|
热99精品里视频精品|
精品少妇一区二区30p|
欧美在线一区二区三区四|
国内精品久久久久久|
欧美一级高清免费播放|
45www国产精品网站|
亚洲精品美女在线观看播放|
国产成人aa精品一区在线播放|
欧美性生交xxxxxdddd|
亚洲永久免费观看|
欧美性做爰毛片|
日韩亚洲精品视频|
日韩电影免费观看在线观看|
波霸ol色综合久久|
高跟丝袜一区二区三区|
色综合视频一区中文字幕|
这里只有精品在线播放|
日韩欧美中文免费|
国产一区二区在线播放|
久久99热精品|
91精品国产91久久久久久|
欧美亚洲视频在线观看|
成人免费看片视频|
久久天天躁狠狠躁夜夜躁2014|
这里只有精品久久|
日韩在线视频免费观看高清中文|
91成人在线视频|
亚洲欧美第一页|
日韩中文字幕不卡视频|
日韩最新中文字幕电影免费看|
久久影院模特热|
91网站免费看|
亚洲欧洲日产国产网站|
色偷偷噜噜噜亚洲男人的天堂|
黑人与娇小精品av专区|
国产精品自拍偷拍视频|
一区二区在线免费视频|
欧美精品久久一区二区|
中文国产成人精品久久一|
九九热视频这里只有精品|
91国产高清在线|
国产午夜精品一区理论片飘花|
5566日本婷婷色中文字幕97|
九九热精品视频国产|
亚洲欧美国产制服动漫|
亚洲综合一区二区不卡|
亚洲精品短视频|
免费成人高清视频|
78m国产成人精品视频|
日韩精品久久久久|
视频在线一区二区|
伊人精品在线观看|
欧美激情中文字幕乱码免费|
久久精品99久久香蕉国产色戒|
91国内产香蕉|
大荫蒂欧美视频另类xxxx|
国产精品盗摄久久久|
国产美女精彩久久|
日韩精品高清视频|
91高清免费视频|
亚洲网站在线播放|
欧美激情免费观看|
日韩在线观看免费高清完整版|
亚洲精品98久久久久久中文字幕|
亚洲free性xxxx护士白浆|
国产一区私人高清影院|
日韩欧美综合在线视频|
欧美一级淫片丝袜脚交|
亚洲香蕉av在线一区二区三区|
国产在线拍揄自揄视频不卡99|
国产精品r级在线|
91在线视频成人|
欧美一区二区三区精品电影|
黑人巨大精品欧美一区免费视频|
欧美极品少妇xxxxⅹ裸体艺术|
色婷婷成人综合|
日韩欧美在线一区|
欧美日韩精品在线观看|
国产精品视频免费在线观看|
国产精品视频永久免费播放|
久久露脸国产精品|
日韩免费精品视频|
精品国产鲁一鲁一区二区张丽|
欧美日韩一区二区三区在线免费观看|
欧美亚洲国产另类|
欧美成人高清视频|
久久精彩免费视频|
深夜福利亚洲导航|
www国产精品com|
欧美精品在线免费|
一区二区三区 在线观看视|
69av在线视频|
欧美激情手机在线视频|
岛国av一区二区三区|
久久久久久久久久亚洲|
亚洲欧美中文字幕|
91视频国产一区|
亚洲人成人99网站|
成人网页在线免费观看|
久久精品视频99|
亚洲精品网址在线观看|
亚洲精品福利免费在线观看|
久久久国产视频91|
91国内揄拍国内精品对白|
亚洲iv一区二区三区|
欧美国产极速在线|
日韩电影大片中文字幕|
国产成人在线精品|
国产69精品久久久久9999|
日韩中文字幕免费|
久久夜色精品亚洲噜噜国产mv|
91精品国产综合久久久久久蜜臀|
久久久999成人|
538国产精品一区二区免费视频|
中文字幕亚洲国产|
亚洲无av在线中文字幕|
欧美国产一区二区三区|
久久精品中文字幕|
国产精品高潮呻吟久久av无限|
国产日韩在线观看av|
91在线观看免费|
久久99国产综合精品女同|
国产精品99久久久久久白浆小说|
亚洲精品98久久久久久中文字幕|
欧美黑人一区二区三区|
九九热精品在线|
国产欧美在线视频|
北条麻妃在线一区二区|
8090理伦午夜在线电影|
91网站免费看|
精品国产一区二区三区在线观看|
精品一区二区亚洲|
97视频在线观看网址|
欧美刺激性大交免费视频|
亚洲精品国精品久久99热|
亚洲国产精品久久久久秋霞蜜臀|
在线日韩日本国产亚洲|
国产视频久久久久|
日韩精品视频在线观看网址|
久久久av网站|
91福利视频在线观看|
亚洲电影av在线|
欧美限制级电影在线观看|
久久精品国产成人|
日韩精品视频免费专区在线播放|
亚洲天天在线日亚洲洲精|
亚洲精品国产精品国产自|
亚洲国产高潮在线观看|
欧美丰满少妇xxxxx|
96精品视频在线|
欧美另类在线观看|
精品国产福利视频|
欧美日韩国产成人在线观看|
粗暴蹂躏中文一区二区三区|
亚洲视频在线免费观看|
91久久在线视频|