8 Mayıs 2012 Salı

PHP - GTK ile Masaüstü Uygulaması Programlama


PHP-GTK, PHP’nin masaüstü yazılım olarak geliştirilmesine katkı sağlamak için oluşturulan bir eklenti olarak yazılmıştır. Diğer masaüstü yazılımlara göre daha zahmetli uygulama olması, GTK’nin gelişmesine engel olsa da, PHP-GTK’nin online bir masaüstü yazılım olabileceği hayali, bu eklentinin rakipsiz bir yazılım olacağının habercisidir.

PHP-GTK, object-oriented programming (OOP) uygulayarak grafik arayüzlü programlar yazmayı sağlamaktadır. Bu bölümde PHP-GTK ile ilgili geniş detaya değinilecektir.

PHP-GTK Nedir?

PHP-GTK aktif PHP gelişime katkı sağlamak amacıyla oluşturulmuş bir eklentidir. Andrei Zimievski imzalı bir açık kaynak uygulamadır. Oluşturulma amacında PHP dilinin geliştirilmesi yatan bu uygulama PHP topluluğu tarafından kabul görmüştür. Fakat daha sonra bu amaçtan bir hayli çıkacaktır. İlk versiyonu 2001 Mart’ında yayımlandıktan sonra PHP-GTK’nin geliştirilmesine daha fazla yazılımcı katılmaya başlamıştır. Scintilla ve GtkHTML gibi çeşitli widgetler ile uyumlu hale getirilerek büyümesi devam ettirilmiştir.

Daha sonraki süreçte 2003 Ekim aylarında GTK 1.0 versiyonu ile tam anlamıyla açık kaynak platform dahilinde geliştirilmeye bırakılmış ve PHP toplulukları tarafından geliştirilmiştir. Bundan sonra kullanım amacı


İrdeleme Köşesi

Widget Nedir?

Görsel programlama çerçevesinde bulunan bir yazılım kütüphanesinin içerisindeki grafik bileşenlerine widget denilmiştir. Button, scrollbar, checkbox, listbox, text, textarea, radiobutton, label, fieldset gibi birçok obje, widget olarak bilinmektedir.



şekillenen PHP-GTK, PHP5 ile geliştirilen nesne yönelimli programlamayı (OOP) kod içerisine entegre etmiştir. Sürekli olarak gelişime devam eden widgetler ise PHP-GTK’nin gerçek bir masaüstü yazılım olmasına olanak sağlamıştır.

Kimilerine göre Java, C++ ya da C# varken PHP-GTK gibi yorucu ve karmaşık bir uygulama kullanmak oldukça yanlış bir yol gibi görünmekteydi. Fakat PHP bilen bir yazılımcının nesne tabanlı yazılım ile PHP-GTK geliştirmesi hiç de zor bir iş olmayacaktı.

PHP-GTK aslında bir uygulama değil, eklentidir. Yalnızca PHP5.1 ve sonraki versiyonlarda kullanılabilmektedir. Bunun sebebi PHP-GTK’nin nesne yönelimli olması ve nesne yönelimli yazılım geliştirilmesinin de PHP 5.0 sürümünden sonra geliştirilmesidir.

PHP’nin bu masaüstü yazılım eklentisi, herhangi bir web tarayıcısına ya da Apache gibi bir sunucuya ihtiyaç duymamaktadır. Çünkü PHP-GTK bir web uygulaması değil, bir masaüstü uygulaması mantığı ile geliştirilmiştir.


PHP-GTK Kurulumu (Windows İçin)

PHP-GTK kurulumu, bunun bir eklenti olması bakımından, eklentilerin kurulum kolaylıkları göz önüne alındığında, oldukça zor ve karmaşık olarak adledilmektedir. Öyle ki, PHP-GTK geliştiricileri, bu durumu “Windows sistemlerde, PHP-GTK kurulum süreci sıkıcı..” gibi bir ifadeyle belirtmektedir. Buradan hareketle Gnope PHP-GTK installer program üretilmiştir. Gnope, bir program yönetim ortamı olarak düşünülebilir. Nitekim grafik arayüzü, PHP-GTK’nin birçok platformda çalışmasına olanak sağlamaktadır.

Bunun dışında manuel kurulum da mümkün olmaktadır. gtk.php.net gtk resmi web sayfasının download bölümünden, kendi işletim sisteminize uygulan olan dosyayı indirdikten sonra kurulum işlemine başlayabiliriz.

Download edilen .rar ya da .zip formatlı kurulum dosyası açıldığında php, winnt ve test klasörleri görülecektir. C:/ sürücüsüne php klasörünü kopyalamak gerekmektedir. Bunun sebebi, yapılan gtk projelerinin bu klasör altında çalıştırılacak olmasıdır. Bu işlemden sonra test klasörü php klasörü içerisine kopyalanacaktır. Şu anda, yapılan projeler c:\php\test adresinde görüntülenmektedir.

Son bir işlem yaptıktan sonra işletim sisteminiz içerisinde PHP-GTK çalıştırabileceksiniz.

PHP-GTK kurulum dosyası
Download edilen dosya içerisinde bulunan winnt klasörünün varlığından bahsetmiştik. Bu klasör açıldığında, php.ini dosyası görülecektir. Bu dosya,  C:/ sürücüsüne kopyalanan php klasöründeki php.ini dosyası ile değiştirildiğinde artık kurulum tamamlanmış olacaktır.

Bu bölümde, Windows işletim sistemleri üzerinde PHP-GTK kurulumu anlatılmıştır. Linux ya da Mac OS X sistemlerinde kurulum yapmak için gtk.php.net/manual/en/tutorials.installation.php adresini ziyaret edebilirsiniz.

İlk GTK Projesi

Programlama dilleri ile ilgili kitaplarda genel olarak ilk proje, “Merhaba Dünya!” ya da “Hello World” ifadesi ile şekillendirilmektedir. Biz de PHP-GTK projesi için böyle bir örnek ile başlayalım. Projeyi geliştirirken, kurulumu da başarılı bir şekilde yapıp yapmadığımızı anlayabileceğiz.

İlk PHP-GTK Projesi – Merhaba Dünya


<?php
function sifirla() {
                        Gtk::main_quit();
}
$window = new GtkWindow();
$window->connect_simple('destroy','sifirla');

$window->set_border_width('50');

$label = new GtkLabel("Merhaba Dünya");
$window->add($label);

$window->show_all();
Gtk::main();
?>


Yukarıdaki kodları ilkgtkprojem.php dosya adıyla kaydedip, konsol kısmından çalıştıralım.

Program çalıştırma


Başlat/çalıştır/cmd
c:\php4\php c:\php4\test\ilkgtkprojem


Yukarıdaki komutlar yazılıp enter tuşuna basıldığında aşağıdaki görüntü elde edilecektir.

ilkgtkprojem.php
Şu an için bu kodlamayı tam anlamıyla anlamanız biraz güç olsa da bu bölümün sonunda en azından fikir sahibi olacağınızı düşünmekteyim. Buradan hareketle ilkgtkprojem.php kodlarını satırlar halinde incelemekte fayda görüyorum.

İlk PHP-GTK Projesi – destroy


function sifirla() {
                        Gtk::main_quit();
}
$window->connect_simple('destroy','sifirla');



Bu satırlar, program kapatıldığında, yeni bir komut girme işlemine izin verilmesi amacıyla yazılmıştır. Bu fonksiyon oluşturulmamış olsaydı program kapatıldıktan sonra konsol çalışmayacak ve tekrardan Başlat/çalıştır/cmd işlemini yapmak durumunda kalacaktık. Aslında destroy yöntemi, bundan önceki çalışan programı ve nesneleri yok etmek için kullanılmaktadır ve connect_simple(destroy) özelliği ile belirtilmektedir.

İlk PHP-GTK Projesi – pencere oluşturma ve özellik verme


$window = new GtkWindow();
$window->set_border_width('50');



Yeni bir pencere kutusu oluşturmak için GtkWindow() nesnesi oluşturulmaktadır.

set_border_width() fonksiyonu ile de pencerenin genişliği ayarlanmaktadır.

İlk PHP-GTK Projesi – pencere oluşturma ve özellik verme


$window->add($label);
$window->show_all();
Gtk::main();



PHP-GTK üzerine çalışma yapıyorsanız bu kodlar sayısız defa karşınıza çıkacaktır. Nitekim var olan widgetlerin sayfada gösterilmesi bu yolla olmaktadır. Program içerisinde oluşturulan her widget, kod sonunda $window->add($widget) şeklinde eklenmelidir.

PHP-GTK Üzerinde İşlem Yapmak

PHP-GTK çok geniş bir fonksiyon kütüphanesine sahiptir. Bunun sebebi geliştirilmiş birçok widget olması ve OOP yöntemi kullanılmasıdır. Önceki uygulamada vurgulanan fonksiyona benzer birçok fonksiyon daha vardır. Fakat bu kitapta bunların hepsine değinebilmek mümkün olmayacaktır. PHP-GTK’nin resmi web sayfasında tüm kütüphaneye erişmek mümkündür. Bu kitapta yalnızca en çok kullanılacak olan bazı fonksiyonları görebileceğiz.

Bazı PHP-GTK Fonksiyonları

Fonksiyon


Özellik

set_size_request(400, 100)
Genişliği 400, yüksekliği 100 birim olan bir widget
modify_bg(Gtk::STATE_NORMAL, GdkColor::parse("#FFFFFF"))
Arka plan rengi beyaz olan bir pencere
modify_font(new PangoFontDescription('Arial 48'))
Font özellikleri arial ve ölçüsü 48 pixel olan bir yazı tipi
set_justify(Gtk::JUSTIFY_RIGHT)
Yazılan metnin align=right olarak ayarlanması
set_justify(Gtk::JUSTIFY_LEFT*)
align=left ya da align=center*
set_title()
Pencere başlığı belirlenmesi
connect(‘clicked’,’’)
Butona tıklandığında devreye girecek olan komut ayarlanması


PHP-GTK eklentisinde fonksiyon ve nesnelerin varlığından bahsetmiştik. Bunun yanında bir de yöntemler vardır. Widgetler, beraberinde bazı olaylar ve yöntemler de taşımaktadırlar. Masaüstü yazılım deneyimi olanların hatırlayacağı gibi, button, clicked özelliğine sahiptir. Üzerine tıklandığında devreye giren bir komut programın akışında belirtilmiştir. PHP-GTK’de bu yönden oldukça geniş bir kütüphaneye sahiptir.
Button nesnesinin bazı yöntemleri

Yöntem


İşlevi

clicked()
Tıklama yapıldığında devreye girer
enter()
Giriş yapıldığında devreye girer
set_alignment()
Butonun bulunacağı yeri ayarlar
set_label()
Butonun metnini belirler
activate()
Widgeti aktif yapar, harekete geçirir
pressed()
Buton üzerinde Mouse ile tıklandığı zaman devreye girer
leave()
Buton üzerinden Mouse çekildiği zaman devreye girer
enter()
Mouse işaretçisi (ok) düğmeye bastığında devreye girer



PHP-GTK kütüphanesinde, Object Hierarchy (nesne hiyerarşisi) bulunmaktadır. Bunun sebebi her bir sınıfın başka bir alt sınıf oluşturması ve OOP kullanarak tam anlamı ile bir dinamizm oluşturmaktır.





GtkButton, GtkWindow, GtkFrame, GtkEventBox, GtkComboBox gibi alt sınıfların her biri teker teker incelenmeye başlanıldığında, her birinin onlarca yönteme sahip oldukları görülecektir.

Pencere Oluşturma ve Widget Yerleştirme

Bir pencere oluşturma – window.php


<?php
$window = &new GtkWindow();
$window->show_all();
Gtk::main();
?>




Bir pencere oluşturma
Yukarıda görüldüğü gibi sadece bir pencere oluşturulmuştur. Buraya boyut verilebilir.

Bir pencere üzerine buton yerleştirme – button.php


<?php
function sifirla() {
            Gtk::main_quit();
}
$window = &new GtkWindow();
$window->connect('destroy', 'sifirla');

$button = &new GtkButton('Button ismi');
$window->add($button);

$window->show_all();
Gtk::main();
?>



Bir pencere üzerine buton yerleştirme
Button bir widgettir. Widgetlerin de uygulanma yöntemleri vardır. Button için clicked yöntemi olduğundan bahsetmiştik. Bir pencere üzerine button yerleştirip, button tıklandığında clicked yönteminin devreye girmesini sağlayalım. Bunun için clicked metoduna bir fonksiyon bağlamak gerekecektir.

Buton oluşturma ve yöntem uygulama – clicked.php


<?php
function sifirla() {
            Gtk::main_quit();
}
//Clicked olayının etkileşim halinde olduğu fonksiyon
function merhaba() {
            global   $window;
            print "Sisteme girdiniz!\n";
            $window->destroy();
}
//Yeni bir pencere oluşturuyoruz.
$window = &new GtkWindow();
$window->connect('destroy', 'sifirla');
//Pencere genişliği 60 pixel olarak ayarlanıyor.
$window->set_border_width(60);
//Pencere başlığı belirleniyor.
$window->set_title("Sisteme girmek istiyorsunuz..");
//Yeni bir buton oluşturuluyor.
$button = &new GtkButton('Sisteme Giriniz..');
//Buton için clicked yöntemi uygulanıyor.
//merhaba() fonksiyonu ile bağlanıyor.
$button->connect('clicked', 'merhaba');
//Buton genişliği 10 pixel olarak ayarlanıyor.
$button->set_border_width(10);
$window->add($button);
$window->show_all();
Gtk::main();
?>



Yukarıdaki kodlar çalıştırılıp ekran görüntüsü alındığında karşımıza bir pencere üzerinde button çıkacaktır. Butona tıklandığında konsola geçilecek ve ekranda giriş yapıldığını belirten bir mesaj çıkacaktır.

Buton oluşturma ve yöntem uygulama


Sisteme Giriniz.. isimli butona tıklandığında clicked olayı merhaba() fonksiyonu devreye sokacaktır.

Buton oluşturma ve yöntem uygulama sonuç ekran görüntüsü
Web tabanlı programlama çerçevesinde veri alışverişi büyük önem taşımaktadır. Zira daha önceki konularda, link üzerinden, form alanları üzerinden ya da veritabanlarından verileri çekip üzerinde işlemler yapmıştık. Şimdi konumuz PHP-GTK ve PHP’yi masaüstü yazılım olarak kullanmaktayız. Verileri çekip, bunları işlemek ihtiyacı her zamanki gibi burada da karşımıza çıkacaktır.

Form alanlarından veri çekip bunları işleme – data.php


<?php

$window = new GtkWindow();
$window->set_size_request(280, 90);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->set_title("input Üzerinden Value Alma");

$window->add($vbox = new GtkVBox());

$baslik = new GtkLabel("Veri Gönderimi-Value Alma\nVeri girip Enter'a Bas!");
$baslik->modify_font(new PangoFontDescription("Sans bold"));
$baslik->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#333"));
$baslik->set_size_request(0, 30);
$vbox->pack_start($baslik, 0, 0);

$hbox = new GtkHBox();
$vbox->pack_start($hbox, 10, 100);
$hbox->pack_start(new GtkLabel("Veri Giriniz."), 0, 10);
$veri = new GtkEntry();
$hbox->pack_start($veri, 0, 30);
$veri->connect('activate', 'verigir');

function verigir($obje) {
$girilen = $obje->get_text();
if (!$girilen==0 && strlen($girilen) > 3)
   echo "Girilen veri = $girilen\n";
elseif ($girilen=='')
   echo "Veri girmeniz gerekmektedir!\n";
else
   echo "En az 4 karakter girmelisiniz!\n";
    $obje->grab_focus();
}

$window->show_all();
Gtk::main();

?>


Yukarıdaki program çok basit bir form aracılığıyla veri taşıma ve işleme yöntemidir. Verilerin girileceği bir text alanı oluşturduk. Daha sonra verileri alıp ekrana yazdırdık.
Form alanlarından veri çekip bunları işleme
Yukarıdaki görüntü incelendiğinde, bir text alanı, veri girilmesini beklemektedir. Veri girişi yapıldıktan sonra enter tuşuna basıldığı an PHP-GTK if, elseif ve else koşullu durumları göz önüne alınarak ekrana veriyi yazdıracaktır. Eğer veri en az 4 karakter olarak girilirse veri ekrana echo fonksiyonu ile yazdırılacaktır. 4’ten az sayıda karakter girilip enter tuşuna basıldığında ekranda bu durum ile ilgili bir hata mesajı gösterilecektir. Hiç veri girilmemiş ve enter tuşuna yine de basılmış ise yine durumu açıklar nitelikteki hata mesajı ekrana yazdırılacaktır.

Bütün bunlar yapılırken PHP-GTK ile PHP arasında kodlama açısında hiçbir fark olmadığı, aksine tam anlamıyla PHP kodlaması yapıldığı görülmektedir. Zira if, else, elseif koşul durumları, echo fonksiyonu, OOP gibi PHP özellikleri kullanıldığı rahatlıkla görülebilmektedir.

Bu kodlamada daha önce görmediğiniz bazı yöntemler ve fonksiyonlar mevcuttur. PHP-GTK’nin geniş kütüphanesinde bulunan her bir fonksiyon gtk.php.net adresinde incelenebilir. Fakat bu program için bilinmeyenlere göz atmak yararlı olacaktır.

vbox() ve hbox() – data.php


$window->add($vbox = new GtkVBox());

$hbox = new GtkHBox();



PHP-GTK kütüphanesi incelendiğinde vbox ve hbox ifadeleri sıkça karşımıza çıkacaktır. Dikey ve Yatay kelimelerinin vertical ve horizontal olarak İngilizce’den çevirmeleri, programlama dillerinde de uygulanmaktadır. vbox() dikey olarak büyüyen, hbox() ise yatay olarak büyüyüp ölçülendirilebilen kutular oluşturmak için kullanılmaktadır.
modify_font() ve modify_fg() – data.php


$baslik = modify_font(new PangoFontDescription("Sans bold"));

$baslik->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#333"));



$baslik degiskeni ile belirlenmiş karakter katarının font özelliklerinin ayarlanması işlemi burada gerçekleştirilmiş ve kalın harfler oluşturulmuştur. Ayrıca yazı rengi #333 olarak ayarlanmıştır.

Veri alımı ve işlenmesi – data.php


// Yeni bir veri giriş (input) alanı oluşturuluyor.
$veri = new GtkEntry();

// activate yöntemine verigir() fonksiyonu ilişkilendiriliyor.
$veri->connect('activate', 'verigir');

//verigir() fonksiyonu oluşturuluyor.
function verigir($obje) {

//Form alanına girilen veri alınıyor.
$girilen = $obje->get_text();

//Girişi yapılan veri eğer boş değil ve karakter sayısı 3 den büyük ise,
//Girilen veri değeri yazdırılıyor.
//Şekil 6.4.8
if (!$girilen==0 && strlen($girilen) > 3)
   echo "Girilen veri = $girilen\n";

//Eğer veri girilmemişse, hata mesajı yazdırılıyor.
//Şekil 6.4.9
elseif ($girilen=='')
   echo "Veri girmeniz gerekmektedir!\n";

//Eğer girilen verinin karakter sayısı 4’ten küçük ise,
//Hata mesajı yazdırılıyor.
//Şekil 6.4.7
else
   echo "En az 4 karakter girmelisiniz!\n";
}


Yukarıdaki kodlar programın en önemli noktalarını oluşturmaktadır. Çünkü form alanından verilerin alınıp işlendiği kodlama buradadır.

En az 4 karakter girme hata mesajı
Hatasız veri girişi
Boş giriş yapılma hata mesajı

modify_font() ve modify_fg() – data.php


$obje->grab_focus();


Bu özellik, program çalıştırıldığında kolaylıkla görülebilecek bir olayı tetiklemektedir. Text alanına veri girip enter tuşuna basmakla birlikte konsol üzerinde bir mesaj alınmaktadır. Aynı zamanda pencere üzerinde giriş bölümü aktif olarak veri girilmesini beklemektedir. Yani text alanı aktiftir. Bunu sağlayan da grab_focus() özelliğidir.

Bazı PHP-GTK Özellikleri

Özellik


Değer


İşlev

set_position()
(Gtk::WIN_POS_CENTER)
Pencerenin ekrandaki konumunu ayarlar
set_title()
($title [string])
Pencerenin başlık bilgisini ayarlar
maximize()

Pencereyi tam ekran yapar
set_size_request()
($genislik[int],$yukseklik[int])
Pencerenin genişlik ve yükseklik ayarını yapar
set_max_width_chars()
(integer)
Örnek: (10)
Belirtilen widget üzerindeki belirtilen genişlik ölçüsü sınırlarına getirilecek olan maksimum karakter sayısını ayarlar
get_max_width_chars()
(integer)
Maksimum karakter kapasitesi
set_line_wrap()
BINARY(true[1], false[0])
Karakter katarını biçer ve pencere ölçüleri dahilinde yazdırır.
set_decorated()
BINARY(true[1], false[0])
Pencerenin kenarlarını kaldırır.
grab_focus()

Seçili text kutusunun kullanılmasını sürekli aktif yapar.
add()

Belirtilen widgeti pencereye ekler.
unmaximize()

Pencere tam ekran olarak ayarlanmamışsa, orijinal boyutlarına döndürür

Uygulamalar

Tarih bilgisini PHP-GTK ile uygulama – tarih.php


<?php
$window = new GtkWindow();
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
$window->set_title("Tarih Bilgisi Göstermek");
$window->set_size_request(250,30);

$tarih = new GtkLabel(date('d/M/Y H:i:s'));

$window->add($tarih);
$window->show_all();
Gtk::main();
?>


Yukarıdaki program tarih.php dosya adı ile kaydedilmiştir. tarih.php çalıştırıldığında pencere üzerinde tarih bilgisinin yazıldığı görülecektir.

tarih.php ekran çıktısı

Border ile çerçeve yapmak – border.php


<?php
$window = &new GtkWindow();
$window->connect_simple('destroy', array( 'Gtk', 'main_quit'));
$window->set_size_request(300,150);
$window->set_title("Border ile Çerçeve Yapmak");

$vbox = new GtkVBox();

$cerceve = new GtkFrame();
$cerceve->modify_bg(Gtk::STATE_NORMAL, GdkColor::parse('#0000ff'));

$baslik = new GtkLabel('Frame ile çerçevelenmiş karakter');
$baslik->set_size_request(10,10);
$cerceve->add($baslik);
$vbox->pack_start($cerceve, 50, 25);

$yazi = new GtkLabel('Metin - Text');
$vbox->pack_start($yazi);

$window->add($vbox);
$window->show_all();
Gtk::main();
?>



Yukarıdaki program, frame ile oluşturulmuş bir alanı border (çerçeve) içerisine almaktadır. Yeni bir pencere, frame, label ve dikey bir kutu oluşturulmuştur.

border.php ekran çıktısı

Menü araç çubuğu oluşturmak – menu.php


<?php
$window = new GtkWindow();
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
$window->set_size_request(300,20);
$window->set_title("Araç Çubuğu Oluşturma");
$menu = new GtkMenuBar();
$dosya = new GtkMenuItem();
$dosya->add(new GtkLabel('Dosya'));
$menu->prepend($dosya);
$duzen = new GtkMenuItem('_Düzen');
$menu->append($duzen);
$yardim = new GtkMenuItem('_Yardım');
$menu->append($yardim);
$window->add($menu);
$window->show_all();
Gtk::main();
?>



menu.php ekran çıktısı
Sistemden çıkış – quit.php


<?php
$window = new GtkWindow();
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
$window->set_title("Sistemden Çıkış");
$window->set_size_request(250,30);

$buton = new GtkButton("Sistemden Çıkmak İstiyorum");

$buton->connect_simple('clicked', array('gtk', 'main_quit'));
$window->add($buton);

$window->show_all();
Gtk::main();
?>



Program çalıştırıldığında ekranda bir pencere üzerinde buton görülecektir. Bu butona tıklandığında sistemten çıkış gerçekleşecektir.

quit.php ekran çıktısı
Bu yazımızda, PHP ile masaüstü uygulamaları yapmaya değindik. Umarım işinize yarayacak bir referans kaynak olmuştur.

Bir sonraki yazıda görüşmek üzere!

1 yorum: