GTK ile Programlama,GTK kullanılarak Grafik Arayüz Oluşturma

GTK ile Programlama,GTK kullanılarak Grafik Arayüz Oluşturma

Mesajgönderen virss » 30 Haz 2007, 11:24

Gtk+ 2 Çalışma Ortamı (windows) : http://mesh.dl.sourceforge.net/sourcefo ... -setup.zip

Linux işletim sistemi üzerinde anlatılmış.

Yazan : Özcan Güngör

GTK ile Programlama

Özet:
Bu makale dizisinde, GTK kullanılarak nasıl grafik kullanıcı arayüzlerinin (GUI) nasıl yazıldığını öğreneceğiz.Ne kadar süreceği hakkında henüz bir fikrim yok.Bu makaleyi anlamak için C'de aşağıdaki konuların bilimesi gerekmektedir:

* Değişkenler
* Fonksiyonlar
* İşaretçiler (Pointers)
_________________ _________________ _________________

GTK Nedir?

GTK(GIMP Toolkit-GIMP Araç Seti), kullanıcı grafik arayüzü oluşturmaya yarayan bir kütüphanedir.GPL lisansı altındadır.Bu kütüphaneyi kullanarak açık-kodlu, ücretiz veya ücretli programlar yazabilirsiniz.

GIMP araç seti olarak tanımlanmasının nedeni, aslında Genel Resim Düzenleme Programı ( General Image Manipulation Program-GIMP) geliştirmek için yazılmış olmasıdır.GTK'nın başlıca yazarları:

* Peter Mattis
* Spencer Kimball
* Josh MacDonald

GTK, nesneden bağımsız bir uygulama programlama arayüzüdür.C'de yazılmış olmasına rağmen, sınıflar(class) ve geriçağırım (callback) fonksiyonları mantığını kullanır.

Derleme

GTK programlarını derlemek için gcc komutuna GTK kütüphanelerinin isimlerini ve yerlerini belirtmek gerekir. Bunun için gtk-config komutu kullanılır.

# gtk-config --cflags --libs

bu komutun çıktısı (sistemden sisteme farklılıklar gösterebilir):
-I/opt/gnome/include/gtk-1.2 -I/opt/gnome/include/glib-1.2 -I/opt/gnome/lib/glib /include -I/usr/X11R6/include -L/opt/gnome/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -l Xext -lX11 -lm


Buradaki parametrelerin açıklamaları şöyledir:
-l library: Belitirtilen yollarda libkütüphane .a şeklinde bir bağlayıcı arar.
-L path: İstenilen kütüphaneyi bu yolda da arar.
-I path: Programda kullanılan başlık dosyalarını arayacağı yolu belitir.

merhaba.c isimli bir GTK programını derlemek için aşağıdaki komutu vermek yeterlidir:

gcc -o merhaba merhaba.c `gtk-config --cflags --libs`

Burada -o parametresinden sonra verilen isim derlenmiş dosyanın ismidir.

İlk Program

Şu anda sisteminizde GTK'nın yüklenmiş olduğunu varsayıyoruz.GTK'nın son versiyonunu ftp.gtk.orgadresinden bulabilirsiniz.

http://www.gimp.org/~tml/gimp/win32/old ... 030115.zip

Şimdi ilk programımızı yazalım.Bu program 200x200 piksel boyutunda boş bir pencere oluşturur.

Kod: Tümünü seç
#include <gtk/gtk.h>

int main( int   argc,
        char *argv[] )
{
   GtkWidget *window;

   gtk_init (&argc, &argv);

   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_widget_show  (window);

   gtk_main ();

   return(0);
}


GtkWidget, pencere ve pencere bileşenlerini(pencere,düğme,listeler,menüler,etiketler...) tanımlayan değişkendir. Programımıza her bir bileşen eklediğimizde bunu GtkWidget ile tanımlayacağız.Burada
GtkWidget *window;
ile pencere tanımlanmış.

void gtk_init(int *argc,char ***argv), araç setini başlatır.Komut satırında verilen parametreleri alır.Bu fonksiyon değişkenler tanımlandıktan sonra kullanılacak ilk fonksiyondur.

GtkWidget *gtk_window_new(GtkWindowType pencere_tipi), yeni bir pencere oluşturmak için kullanılır.Pencere tipi olarak şunlar kullanılabilir:

* GTK_WINDOW_TOPLEVEL: Tam bir penceredir.Pencere ismi, kapatma, küçültme ve büyütme düğmeleri vardır.
* GTK_WINDOW_DIALOG: Pencere ismine sahiptir. Kapatma, küçültme ve büyütme düğmeleri yoktur.
* GTK_WINDOW_POPUP: Pencerenin çerçevesi yokttur.Dolayısı ile pencere ismi, kapatma, küçültme ve büyütmedüğmeleri yoktur.

void gtk_widget_show(GtkWidget *widget), bileşenin ekranda görünüp görünmesini sağlar.Bir bileşen tanımlanıp oluşturulduktan sonra bu fonksiyon ile görünmesi sağlanır.

void gtk_main(void), pencereni ve bileşenlerini hazırlar, birleştirir ve ekranda gösterir.Bu fonksiyon, GTK programlarının sonunda mutlaka kullanılması gerekir.

Pencerelerin birkaç özelliğini kullanalım.Örneğin pencere başlığının değiştirilmesi, pencere boyutunun değiştirilmesi...

void gtk_window_set_title(GtkWindow *window,const gchar *title), beirtilen pencerenin (window) belirtilen başlığı almasını sağlar.Farkettiyseniz fonksiyonun ilk parametresi GtkWindow tipinde.Ancak bizim window değişkenimiz GtkWidget tipinde.Derleme sırasında bir uyarı alırız.Program çalışır ama bunu düzeltmek daha iyidir.Bunun için GTK_WINDOW(GtkWidget *widget) kullanılır.İkinci parametre olan title ise gchar tipinde.gchar glib içinde tanımlanmış bir değişkendir ve char'dan bir farkı yoktur.

void gtk_window_set_default_size(GtkWindow *window, gint width, gint height), belirtilen pencerenin boyutunu ayarlar.İkinci parametre genişlik, üçüncü parametre yüksekliktir.gint yine glib içinde tanımlanmıştır ve int'den farkı yoktur.

void gtk_window_set_position(GtkWindow *window, GtkWindowPosition position)
pencerenin ekrandaki yerinini belirler.position, şu değerleri alabilir:

* GTK_WIN_POS_NONE
* GTK_WIN_POS_CENTER
* GTK_WIN_POS_MOUSE
* GTK_WIN_POS_CENTER_ALWAYS

Aşağıda örnek bir program bulunmaktadadır:

Kod: Tümünü seç
#include <gtk/gtk.h>

int main( int   argc,
        char *argv[] )
{
   GtkWidget *window;

   gtk_init (&argc, &argv);

   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_window_set_title(GTK_WINDOW(window),"İlk Program");
   gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
   gtk_window_set_default_size(GTK_WINDOW(window),300,300);
   gtk_widget_show  (window);

   gtk_main ();

   return(0);
}



Sinyaller ve Olaylar

GTK programlarına fare veya klavye ile müdahalede (klavyeden bilgi girmek veya bir düğmeye tıklamak gibi) bulunmak gerecektir.Bunun için GTK kütüphanesinde şu fonksiyon kullanılır:

guint gtk_signal_connect_object(GtkObject *object,const gchar *name,GtkSignalFu nc func,GtkObject *slot_object);

object, sinyali dinelenecek bileşendir.Örneğin bir düğme bileşine tıklandığını anlamak için object, düğme olacaktır. name , olayın ismidir ve şu değerleri alabilir:

* event
* button_press_event
* button_release_event
* motion_notify_event
* delete_event
* destroy_event
* expose_event
* key_press_event
* key_release_event
* enter_notify_event
* leave_notify_event
* configure_event
* focus_in_event
* focus_out_event
* map_event
* unmap_event
* property_notify_event
* selection_clear_event
* selection_request_event
* selection_notify_event
* proximity_in_event
* proximity_out_event
* drag_begin_event
* drag_request_event
* drag_end_event
* drop_enter_event
* drop_leave_event
* drop_data_available_event
* other_event

func olay gerçekleştiğinde çağırılacak fonksiyonun ismidir.Şimdi bir örnek verelim:

Kod: Tümünü seç
#include <gtk/gtk.h>

void close( GtkWidget *widget,gpointer *data)
{
   gtk_main_quit();
}

int main( int   argc,char *argv[] )
{
   GtkWidget *window;

   gtk_init (&argc, &argv);

   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_signal_connect (GTK_OBJECT (window), "destroy",
                  GTK_SIGNAL_FUNC (close), NULL);
   gtk_widget_show  (window);

   gtk_main ();

   return(0);
}



The function

gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (close), NULL)
komutu, pencerenin kapatılması sırasında çalışacak ve kapat fonksiyonunu çağıracaktır.Kapat fonksiyonu ise gtk_main_quit() fonksiyonunu çağırarak gtk_main() fonksiyonunun sona ermesini sağlar.Böylece pencere kapatıldığında programımız da sona erer.

Bu konuyla ilgili ayrıntılar daha ileriki bölümlerde anlatılacaktır.

Normal Düğmeler

Düğmler, genelde basıldığında bir işlem gerçekleştirmek için kullanılan bileşenlerdir.İster web sayfaları olsun ister grafik arayüzleri olsun, düğmelerin amaçları budur.GTK kütüphanesinde normal düğmeler iki şekilde oluşturulur:

1. GtkWidget* gtk_button_new (void);
2. GtkWidget* gtk_button_new_with_label (const gchar *label);

Birinci fonksiyon, isimsiz, boş bir düğme oluşturur.İkincisi ise üzerinde label yazan bir düğme oluşturur.

Burada yeni bir fonksiyon kullanacağız:

void gtk_container_add(GtkContainer *container,GtkWidget *widget)

Bu fonksiyon ile bir bileşeni bir pencereye(daha genek olarak taşıyıcılar) ekleme işlemi yapılır.Bu örnekte taşıyıcı, window ve bileşen düğmedir.İleride başka taşıyıcılar da göreceğiz.

Düğmelerde en önemli şey, düğmeye basılmasıdır.Bunu anlamak için yine gtk_signal_connect fonksiyonunu kullanacağız ve bir fonksiyon çağıracağız.Bu fonksiyon içinde ne yapılacağını belirleyeceğiz.

Kod: Tümünü seç
#include <gtk/gtk.h>

void close( GtkWidget *widget,gpointer *data)
{
   gtk_main_quit();
}

void clicked(GtkWidget *widget,gpointer *data)
{
      g_print("Button Clicked\n");
}
int main( int   argc,char *argv[] )
{
   GtkWidget *window,*button;

   gtk_init (&argc, &argv);

   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_signal_connect (GTK_OBJECT (window), "destroy",
                  GTK_SIGNAL_FUNC (close), NULL);

   button=gtk_button_new_with_label("Button");
   gtk_container_add(GTK_CONTAINER(window),button);
   gtk_signal_connect(GTK_OBJECT(button),"clicked",
                  GTK_SIGNAL_FUNC(clicked),NULL);
   gtk_widget_show(button);

   gtk_widget_show(window);

   gtk_main ();

   return(0);
}

Kullanıcı avatarı
virss
Deneyimli Üye
Deneyimli Üye
 
Mesajlar: 377
Kayıt: 27 Eki 2006, 00:00
Konum: İstanbul

Mesajgönderen fortran » 30 Haz 2007, 15:29

virss teşekkürler. Programlama ile ilgilisin. Ben Windows ortamında C# ile çalışmıştım. Linux altında da bununla ilgili olarak Mono adlı bir yazılımın olduğunu duymuştum. Yeri burası değil belki ama, C# konusundaki tecrübelerimi değerlendirerek Linux altında nasıl çalışabileceğim konusunda bilgi verirsen sevinirim.
Kullanıcı avatarı
fortran
Forum Gurusu
Forum Gurusu
 
Mesajlar: 4462
Kayıt: 26 Kas 2006, 01:00

Mesajgönderen fnoyan » 30 Haz 2007, 19:08

Merhaba

GTK için aşağıdaki kitabı inceleyebilirsiniz.

http://www.papatya.gen.tr/linuxProgramlama.htm

Ayrıca GTK'nın kendi manual sayfası da çok güzel bilgiler veriyor.

C# ile ilgileniyorsanız OOP ile aranız iyi demektir ;) GTKMM ilgilnizi çekebilir.

Mono konusunda bilgim yok ne yazık ki :(

İyi çalışmalar...
Fehmi Noyan İSİ
Fehmi Noyan İSİ -- fnoyan at linuxmail dot org
------------------------------------------------------
My DNA is written in C with VIM, compiled with GCC and running on LINUX on human body platform.
Kullanıcı avatarı
fnoyan
Forum Gurusu
Forum Gurusu
 
Mesajlar: 683
Kayıt: 08 Nis 2004, 00:00

Mesajgönderen fortran » 30 Haz 2007, 22:33

fnoyan teşekkür ederim.
Kullanıcı avatarı
fortran
Forum Gurusu
Forum Gurusu
 
Mesajlar: 4462
Kayıt: 26 Kas 2006, 01:00


Dön Glade / Anjuta, GTK

Kimler çevrimiçi

Bu forumu gezen kullanıcılar: Hiç bir kayıtlı kullanıcı yok ve 1 misafir

cron