[LinuxFocus-icon]
<--  | Ana Sayfa  | Erişimdüzeni  | İçindekiler  | Arama

Duyumlar | Belgelikler | Bağlantılar | LF Nedir
Bu makalenin farklı dillerde bulunduğu adresler: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Russian  Turkce  

Ozcan Gungor
Özcan GÜNGÖR
<ozcangungor(at)netscape.net>

Yazar hakkında:
Askerliğimi Linux, Oracle yöneticisi ve web programcısı olarak yapmaktayım.
İçerik:

 

GTK ile GUI Programlama

GTK

Özet:

Bu makale dizisinde, grafiksel kullanıcı arayüzlerini GTK ile nasıl yazabileceğimizi öğreneceğiz. Bu dizinin ne kadar süreceğini hakkında fikrim yok. Bu dizinin anlaşılabilmesi için C dili hakkında aşağıdaki konuların bilinmesi gerekmektedir:

  • Değişkenler
  • Fonksiyonlar
  • İşaretçiler (Pointer)
Önceki sayıların okunması da önerilir:

Askeliğimi yaptığım için bu makale birazcık kısa.

_________________ _________________ _________________

 

Toggle Düğmeleri

Bu düğme normal bir düğme olarak görünmektedir ancak iki durumu vardır: Basılı ya da değil. Bir toggle düğmesi oluşturmak için aşağıdaki fonksiyon kullanılır :

GtkWidget *toggle=gtk_toggle_button_new(void);
GtkWidget *toggle=gtk_toggle_button_new_with_label(const gchar *label);

İlk fonksiyon toggle butonunu üzerinde bir yazı olmadan oluşturur ancak ikincisi, düğmeyi üzerinde label yazısı ile birlikte oluşturur.
Düğmenin durumunu aşağıdaki fonksiyonla belirleyebilirsiniz:

gtk_toggle_button_set_active (GtkToggleButton *toggle_button,
                              gboolean is_active);

toggle_button, durumunu değiştirmek istediğimiz düğmedir ve is_active, durumdur (0 ya da 1). 0 ise basılı değildir; 1 ise basılıdır.

Düğmenin durumunu aşağıdaki fonksiyonla öğrenebiliriz:

gboolean gtk_toggle_button_get_active(GtkToggleButton *button);

"toggled" olayı, bu düğmeye eklenebilir:

İşte bir örnek:

#include <gtk/gtk.h>
void togg(GtkWidget *widget, gpointer *data){
   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data)))
    g_print("Durum: 1\n");
   else
    g_print("Durum: 0\n");
}

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

   GtkWidget *window;
   GtkWidget *button;

   gtk_init (&argc, &argv);

   /* Bir pencere oluşturur */
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_window_set_title (GTK_WINDOW (window), "Toggle Düğmesi");

   /* destroy olayını pncereye ekler */
   gtk_signal_connect (GTK_OBJECT (window), "destroy",
                       GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

   /* bir toggle düğmesi oluşturur */
   button=gtk_toggle_button_new_with_label("Ben bir toggle düğmesiyim");

   /* Düğmeyi pencereye ekler */
   gtk_container_add(GTK_CONTAINER(window),button);

   /* toggled olayını düğmeye ekler*/
   gtk_signal_connect (GTK_OBJECT (button), "toggled",
                       GTK_SIGNAL_FUNC(togg),(gpointer *)button);

   gtk_widget_show(button);
   gtk_widget_show (window);

   gtk_main ();
   return(0);
}
 

İşaretleme Düğmesi

İşaretleme düğmesi ( işaretleme kutusu olarak da bilinir), toggle düğmesinin bir altsınıfıdır. Birkaç seçeneği işaretlemek için kullanılabilir:

GtkWidget* gtk_check_button_new (void);
GtkWidget* gtk_check_button_new_with_label (const gchar *label);

Açıklamalar toggle düğmesi ile aynıdır.

Örnek :

#include <gtk/gtk.h>
void togg(GtkWidget *widget, gpointer *data){
   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data)))
       g_print("Durum: 1\n");
   else
    g_print("Durum: 0\n");
}

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

    GtkWidget *window;
    GtkWidget *button;

    gtk_init (&argc, &argv);

    /* Yeni bir pencere oluşturur */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "İşaretleme Düğmesi");

    /* destroy olayını pencereye ekler. */
    gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

    /* bir işaretleme düğmesi oluşturur */
    button=gtk_check_button_new_with_label("Ben bir işaretleme kutusuyum");

    /* Düğmeyi pencereye ekler */
    gtk_container_add(GTK_CONTAINER(window),button);

    /* toggled olayını düğmeye ekler */
    gtk_signal_connect (GTK_OBJECT (button), "toggled",
                        GTK_SIGNAL_FUNC(togg), (gpointer *)button);
    gtk_widget_show(button);
    gtk_widget_show (window);

    gtk_main ();
    return(0);
}
 

Etiketler

Etikeler, herhangi bir yazıyı pencerinin herhangi bir yerine yerleştirmenizi sağlar.
Bir etiket oluşturmak için aşağıdaki fonksiyon kullanılır:

GtkWidget* gtk_label_new(const gchar *text);

Aşağıdaki fonksiyon ile

gtk_label_set_text(GtkLabel *label, gchar *text);

bir etiket üzerindeki yazıyı istediğniz zaman değiştirebilirsiniz.

gtk_label_set_justify(GtkLabel *label, GtkJustification jtype);

gtk_label_set_justify fonksiyonu, etiket üzerindeki yazının yerleşimini ayarlar. jtype, aşağıdaki değerleri alabilir:

gtk_label_set_line_wrap (GtkLabel *label,gboolean wrap);

fonksiyonu, yazının yerleştirilmeis gereken yere sığmadığı zaman bölünebilip bölünemeyeceğini belirler. wrap, 1 ise yazı bölünebilir; 0 ise bölünemez.

gtk_label_get(GtkLabel *label, gchar **str)

fonksiyonu, etiket üzerindeki yazıyı str değişkenine atar.

 

Araç Açıklaması

Araç açıklaması, fare bir aracın üstüne geldiğinde küçük bir açıklama yazısının çıkmasını sağlar. Örneğin, bir düğme için açıklama hazırlarsınız ve fare, bu düğmenin üstüne geldiğinde "bilgileri gönder" şeklinde bir açıklama çıkar.

Bunun için önce GtkToolTips oluşturulmalıdır:

GtkToolTips* gtk_tooltips_new();

Bu açıklama bir araca eklenir:

gtk_tooltips_set_tip(GtkTooltips *tooltips, GtkWidget *widget,
                     const gchar *tip_text,const gchar *tip_private);

Küçük bir örnek:

#include <gtk/gtk.h>
int main( int argc,char *argv[] )
{
    GtkWidget *window;
    GtkWidget *button;
    GtkTooltips *tip;

    gtk_init (&argc, &argv);

    /* Bir pencere oluşturulur */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "Tooltips");

    /* destroy olayı pencereye eklenir */
    gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        GTK_SIGNAL_FUNC (gtk_main_quit), NULL);

    /* Düğme oluşturlur */
    button=gtk_button_new_with_label("Ben bir düğmeyim");

    /* Düğme pencereye eklenir */
    gtk_container_add(GTK_CONTAINER(window),button);

    /* açıklama oluşturulur*/
    tip=gtk_tooltips_new();

    /* bu açıklama bir yazı ile düğmeye eklenir*/
    gtk_tooltips_set_tip(tip, button, "Beni Tıkla!",NULL);

    gtk_widget_show(button);
    gtk_widget_show (window);

    gtk_main ();
    return(0);
}

Diğer bazı fonksiyonlar:

gtk_tooltips_enable (GtkTooltips *tooltips);

Fare araç üzerine geldiğinde açıklama çıkmasını sağlar.

gtk_tooltips_disable (GtkTooltips *tooltips);

Fare araç üzerine geldiğinde açıklama çıkmamasını sağlar.

Herhangi bir araca ait açıklamayaı almak için şu fonksiyonu kullanırız:

GtkTooltipsData* gtk_tooltips_get_data(GtkWidget *widget);

GtkTooltipsData, aşağıdaki şekilde bir yapıdır:

struct _GtkTooltipsData
{
   GtkTooltips *tooltips;
   GtkWidget *widget;
   gchar *tip_text;
   gchar *tip_private;
   GdkFont *font;
   gint width;
   GList *row;
};
Açıklamanın görünmesi için geçen zamanı aşağıdaki fonksiyonla değiştirebilirsiniz:
gtk_tooltips_set_delay (GtkTooltips *tip, guint delay)
 


Combo Kutusu

Combo kutusu, tıklandığında aşağı doğru uzayan bir liste içinde size seçenekler sunan bir kutudur.

Aşağıdaki fonksiyonla bir combo kutusu oluşturulabilir:

GtkWidget *gtk_combo_new();

GList yapısında seçenekler listesine gereksinim vardır:

GList *glist=NULL;

Şu fonksiyon ile listeye seçenekler eklenir:

GList *g_list_append(GList *list, gchar *option);

Ve bu liste kutuya eklenmelidir:

gtk_combo_set_popdown_strings(GtkCombo *combo, GList *List);

Kutu hazır. Seçimi şu şekilde elde edebiliriz :

gchar *gtk_entry_get_text(GtkEntry *entry);

entry bizim durumumuzda GTK_ENTRY(GTK_COMBO(combo)->entry))'dir.

gtk_combo_set_use_arrows(GtkCombo *combo,gint val);

Bu fonksiyon, klavye üzerindeki aşağı/yukarı tuşlarının seçenekleri değiştirmesini sağlar ya da iptal eder. val 0 ise tuşlar işe yaramaz; 1 ise tuşlar çalışır. Unutmayın, eğer yazarak girdiğiniz değer listedeki değerlerden farklı ise bu tuşlar hiçbir şekilde etkin değildir.

gtk_combo_set_use_arrows_always(GtkCombo *combo,gint val);

Bu fonksiyon gtk_combo_set_use_arrows ile aynı işi yapar ama bir farkla: Yazarak girdiğiniz değer listedeki değerden farklı ise de tuşlar etkindir.

gtk_combo_set_case_sensetive(GtkCombo *combo, gint val);

val 1 ise hergangi birşey yazabilirsiniz. 0 ise eğer yazdığınız değer listedeki bir değerle aynı ise otomatik olarak listedeki değere dönüştürülür.

#include <gtk/gtk.h>
void act(GtkWidget *widget, gpointer *data){
   g_print((gchar *)data);
}

int main( int argc,char *argv[] ) {
   GtkWidget *window;
   GtkWidget *combo;
   GtkWidget *button;
   GtkWidget *box;
   GList *list=NULL;

   list=g_list_append(list,"Slackware");
   list=g_list_append(list,"RedHat");
   list=g_list_append(list,"SuSE");

   gtk_init (&argc, &argv);

   /* Bir pencere oluşturur */
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_window_set_title (GTK_WINDOW (window), "Combo Kutusu");

   /* destroy olayını pencereye ekler*/
   gtk_signal_connect (GTK_OBJECT (window), "destroy",
                       GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

   /* yatay bir kutu oluşturur */
   box=gtk_hbox_new(1,0);
   gtk_container_add(GTK_CONTAINER(window),box);

   /* combo kutusu oluşturur */
   combo=gtk_combo_new();

   /* listeyi kutuya ekler */
   gtk_combo_set_popdown_strings(GTK_COMBO(combo),list);

   /* aşağı/yukarı tuşlarını etkinleştirir */
   gtk_combo_set_use_arrows_always(GTK_COMBO(combo),1);

   gtk_box_pack_start(GTK_BOX(box), combo,1,1,1);

   button=gtk_button_new_with_label("Değeri Yaz");
   gtk_signal_connect(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(act),
   				gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)));
   gtk_box_pack_start(GTK_BOX(box), button,1,1,1);

   gtk_widget_show(box);
   gtk_widget_show(combo);
   gtk_widget_show(button);
   gtk_widget_show (window);

   gtk_main ();
   return(0);
   }
Her türlü öneri ve eleştirilerinizi gönderebilirsiniz.  

Bu yazı için görüş bildiriminde bulunabilirsiniz

Her yazı kendi görüş bildirim sayfasına sahiptir. Bu sayfaya yorumlarınızı yazabilir ve diğer okuyucuların yorumlarına bakabilirsiniz.
 talkback page 

<--, Bu sayının ana sayfasına gider

Görselyöre sayfalarının bakımı, LinuxFocus Editörleri tarafından yapılmaktadır
© Özcan GÜNGÖR, FDL
LinuxFocus.org
Çeviri bilgisi:
tr --> -- : Özcan GÜNGÖR <ozcangungor(at)netscape.net>

2004-03-04, generated by lfparser version 2.43