İlk Gtk Programım.

Başlatan mrti14, 30 Ekim 2010 - 17:19:00

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

mrti14

Dostlar bu aralar gtk öğrenmeye karar verdim.Daha önceleri allegro  kütüphanesiyle küçük oyunlar yaptım.Artık arayüzü olan işe yarar programlarla uğraşmak istiyorum.Gtk daki temel widgetleri kullanarak ve standart c kütüphanesiyle öylesine bir deneme yaptım.Yakında daha da geliştirmeyi umuyorum.* herkese saygılar.Program girilen bilgileri .txt dosyasına kaydediyor.



İndirme: http://ubuntuone.com/p/MyX/

Birtakım eğitseller: http://zetcode.com/tutorials/gtktutorial/
                                  http://library.gnome.org/devel/gtk-tutorial/2.21/

Allegro ile ilgili karalamalarım: http://amatorprogramlama.blogspot.com/ yakında gtk bilgilerimle beraber güncelleyeceğim.

hckr

Güzel olmuş da kodları da indirme dosyaları içerisinde versen güzel olurdu.  :)

sema

Teşekkürler, yalnız dosya.txt içeriği boş sanki. Kontrol eder misiniz, görmek isterdim..
susema

NSDAP

Glade ilemi arayüzü tasarladınız ?

mrti14

.txt içeriğini ben sildim.Siz birşeyler yazıp kaydet deyin.Sonucu kendiniz görün.İlgilenenler için kaynak kod aşağıda.Çok değişik widgetler containerlar ve bunların bir sürü özelliği var.Değişik şekillerde yazılabilirdi.

#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

FILE *dosya;
GtkWidget *entry1,*entry2,*entry3,*entry4;

void metin_kaydet(GtkWidget *widget,gpointer data){
     dosya=fopen("dosya.txt","a");
     gchar *text;
     char buf[50];
   
     text = gtk_entry_get_text (GTK_ENTRY (entry1));
     sprintf(buf, "İsim   : %s\n", text);
     fputs(buf,dosya);
     
     text = gtk_entry_get_text (GTK_ENTRY (entry2));
     sprintf(buf, "Soyisim: %s\n", text);
     fputs(buf,dosya);
     
     text = gtk_entry_get_text (GTK_ENTRY (entry3));
     sprintf(buf, "Yaş    : %s\n", text);
     fputs(buf,dosya);
     
     text = gtk_entry_get_text (GTK_ENTRY (entry4));
     sprintf(buf, "Şehir  : %s\n\n", text);
     fputs(buf,dosya);
     fputs("---------------------\n\n",dosya);
     fclose(dosya);
 
}

int main( int argc, char *argv[] )
{
    GtkWidget *pencere;
    GtkWidget *vbox,*hbox1,*hbox2,*hbox3,*hbox4,*hbox5;
    GtkWidget *kaydet,*kapat,*halign,*valign;
    GtkWidget *label1,*label2,*label3,*label4;
   
   
   
    gtk_init(&argc, &argv);
   
    pencere=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(pencere),"Kayıt");
    gtk_window_set_default_size(GTK_WINDOW(pencere),200,150);
    gtk_window_set_resizable(GTK_WINDOW(pencere),TRUE);
    gtk_container_set_border_width(GTK_CONTAINER(pencere), 5);
    gtk_window_set_position(GTK_WINDOW(pencere),GTK_WIN_POS_CENTER);
   
    halign  = gtk_alignment_new(1, 0, 0, 0);
   
    vbox=gtk_vbox_new(FALSE,5);
    gtk_container_add(GTK_CONTAINER(pencere),vbox);
   
    hbox1=gtk_hbox_new(FALSE,5);
    hbox2=gtk_hbox_new(FALSE,5);
    hbox3=gtk_hbox_new(FALSE,5);
    hbox4=gtk_hbox_new(FALSE,5);
    hbox5=gtk_hbox_new(TRUE,5);
   
    label1=gtk_label_new("İsim:      ");
    label2=gtk_label_new("Soyisim: ");
    label3=gtk_label_new("Yaş:       ");
    label4=gtk_label_new("Şehir:    ");
   
    entry1=gtk_entry_new();
    entry2=gtk_entry_new();
    entry3=gtk_entry_new();
    entry4=gtk_entry_new();
   
    kaydet=gtk_button_new_with_label("Kaydet");
    gtk_widget_set_size_request(kaydet,60,30);
    kapat=gtk_button_new_with_label("Kapat");
    gtk_widget_set_size_request(kapat,60,30);
   
    gtk_container_add(GTK_CONTAINER(hbox1),label1);
    gtk_container_add(GTK_CONTAINER(hbox1),entry1);
    gtk_container_add(GTK_CONTAINER(vbox),hbox1);
   
    gtk_container_add(GTK_CONTAINER(hbox2),label2);
    gtk_container_add(GTK_CONTAINER(hbox2),entry2);
    gtk_container_add(GTK_CONTAINER(vbox),hbox2);
   
    gtk_container_add(GTK_CONTAINER(hbox3),label3);
    gtk_container_add(GTK_CONTAINER(hbox3),entry3);
    gtk_container_add(GTK_CONTAINER(vbox),hbox3);
   
    gtk_container_add(GTK_CONTAINER(hbox4),label4);
    gtk_container_add(GTK_CONTAINER(hbox4),entry4);
    gtk_container_add(GTK_CONTAINER(vbox),hbox4);
   
    gtk_container_add(GTK_CONTAINER(hbox5),kaydet);
    gtk_container_add(GTK_CONTAINER(hbox5),kapat);
    gtk_container_add(GTK_CONTAINER(halign),hbox5);
    gtk_container_add(GTK_CONTAINER(vbox),halign);

    gtk_widget_show_all(pencere);
   
    g_signal_connect(G_OBJECT(pencere), "destroy",
      G_CALLBACK(gtk_main_quit), NULL);
     
    g_signal_connect(G_OBJECT(kapat), "clicked",
      G_CALLBACK(gtk_main_quit), NULL);
     
    g_signal_connect(kaydet, "clicked",
      G_CALLBACK(metin_kaydet), NULL);
     
    gtk_main();

    return 0;
}



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 30 Ekim 2010 - 17:31:31

Glade ile henüz tasarım yapmıyorum.Fakat widgetların davranışlarını canlı olarak görmek ve anlamak için kullanıyorum.İlerde glade ile tasarlarım.Glade ile ilgili eğitsel şu adreste mevcut: http://www.micahcarrick.com/gtk-glade-tutorial-part-1.html

sem

Paylaşım için teşekkürler. Tahmin ediyorum ki GTK ile ilgili sorular sorulacaktır size =)... Bu aralar GTK öğrenmesi gereken daha doğrusu öğrenmek isteye bir kaç kişimiz var da =) Ben de dahil =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

hckr

Alıntı yapılan: sem0900 - 30 Ekim 2010 - 17:39:37
Paylaşım için teşekkürler. Tahmin ediyorum ki GTK ile ilgili sorular sorulacaktır size =)... Bu aralar GTK öğrenmesi gereken daha doğrusu öğrenmek isteye bir kaç kişimiz var da =) Ben de dahil =)
Kesinlikle, ben de hesap makinesi yazarak başlayım dedim :) GTK'ya glade de tasarım yaptım ama fonksiyonu çalıştırdığım zaman hata alıyorum.

badhero

Başlangıç olarak iyi, bunun üstüne bir şeyler koyarak daha iyilerini yapacağına şüphem yok. :)

mrti14

Teşekkürler dostlar.Glade ile tasarım bence ikinci aşama olmalı.Fonksiyonları ve mantığı anlamak lazım.İlk başta banada zor geldi.İngilizcemde pek yok ama isteyince oluyor.Çok bilgim yok.Ama bildiğim kadarıyla soruları cevaplarım.Şimdi.Programı geliştiryorum.Kullanıcı adı, şifre,uyarı pencereleri ve menü ekleyeceğim.

sem

Evet bence de önce mantığı kavramak lazım.

vbox ve hbox yerleştirmelerini öğrenip, table olayını kavrarsam eğer projelere başlayacağım ben de. Gece bakma fırsatım olacak bunlara. Bunlar çok önemli sanıyorum geliştirme aşamasında.

Şimdilik sorum bu olsun size; önce label1 i bir hbox1 a sonra entry1'i hbox1 a koyuyorsunuz. Sonra ikisini birden bir vbox'a ekliyorsunuz. Bunu 5 kere bütün hepsi için yapıyorsunuz. vbox'ı daha önceden pencere değişkenine (ya da widget) eklediğiniz için:

gtk_widget_show_all(pencere);

Bu komutla "pencere" gösterilmesini söyleyince vbox ve içindekiler de otomatik olarak GTK ile gösterilmiş mi oluyor?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

mrti14

gtk_widget_show_all(pencere);  Evet bu kod ile pencere üzerindeki her şey gözüküyor.Tek tek widgetleri göstermek zorunda kalmıyorsunuz.Table ise benim hala aklımı karıştırıyor.

sem

Çok ilginç bir sistemi var, enteresan gerçekten. Yani herhangi bir lokasyon belirtmek yok. Sıra ile ekleyince alt alta eklediğiniz sıra ile kendisi ekliyor görüntülenecek nesneleri. O zaman isim ile soyisim arasında atıyorum diğerlerinin iki katı kadar boşluk bırakmak istiyorsak ne yapmamız lazım acaba?

Ya da şöyle bir görünüm için:
________________________________________________________________________________________________
                                                                                                                                                                                                                               |
isim:                    entry1************yaş:                                       entry3                                                                                                          |
*                                                                                                                                                                                                                              |
*                                                                                                                                                                                                                              |
*                                                                                                                                                                                                                              |
*                                                                                                                                                                                                                              |
soyisim:entry2****yer:                                                                                               entry4                                                                              |
________________________________________________________________________________________________|


entry leri bilerek kaydırdım. Yıldızlar da bilerek koydum (*) ... Yani bu şekilde dağınık yapmak istersek eğer ne yapmak lazım acaba. Çünkü dediğim gibi sadece "add" fonksiyonu ile ekleme görüyorum. Yani bir yer belirleme fonksiyonu gözüme çarpmadı.?

//Umarım demek istediğimi anlatabilmişimdir.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

hitokiri

table da yer belirme yapılabiliyor ,
table(3,3)
enine ve boyuna 3 e bölüyor,
yani
0---------1---------2-----------3
| entry1   |             |  entry2     |
1---------|----------|-----------|
|             |               |               |
2---------|----------|------------|
| entry3  |               |                |
3---------|----------|------------|

table.attach(entry1,0,1,0,1)
table.attach(entry2,2,3,0,1)
table.attach(entry3,0,1,2,3)
yani pygtk ile şu şekilde birbirlerine az çok benziyorlar fikir vermesi açısından paylaşayım,
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import gtk
pen = gtk.Window(); pen.connect("delete_event",gtk.main_quit)
table = gtk.Table(3,3)
entry1 = gtk.Entry() ; entry1.set_text("1")
entry2 = gtk.Entry() ; entry2.set_text("2")
entry3 = gtk.Entry(); entry3.set_text("3")

table.attach(entry1,0,1,0,1)
table.attach(entry2,2,3,0,1)
table.attach(entry3,0,1,2,3)

pen.add(table)

pen.show_all()
gtk.main()

mrti14

#13
Ben vbox ,hbox ve alignment kullanarak düzeni sağlamaya çalıştım.Böylece pencere büyütülünce widgetlerde uygun şekilde yer değiştirsinler dedim.Senin istediğini yapmak için fixed frame kullanabilirsin.Fixed framede widget konumlarını sen belirlersin.Pencere büyüdüğünde fixed frame içerisindekiler aynen bulundukları yerde ve boyutta kalırlar.Fixed için gladele tasarım en kolay yol.Pencere boyutu değişmeyecekse pencere özelliklerinden gtk_window_set_resizable(GTK_WINDOW(pencere), FALSE); diyerek pencere büyütülmesini engellersin.Yada widgetler,alignmentler,ve box lar arasında boğalabilirsin :)Table yapısı benimde kafamı çokça karıştırıyor.Ama düzen için kullanılması çok gerekli bir yapı.

sem

Alıntı yapılan: mrti14 - 30 Ekim 2010 - 19:35:11
Ben vbox ,hbox ve alignment kullanarak düzeni sağlamaya çalıştım.Böylece pencere büyütülünce widgetlerde uygun şekilde yer değiştirsinler dedim.Senin istediğini yapmak için fixed frame kullanabilirsin.Fixed framede widget konumlarını sen belirlersin.Pencere büyüdüğünde fixed frame içerisindekiler aynen bulundukları yerde ve boyutta kalırlar.Fixed için gladele tasarım en kolay yol.Pencere boyutu değişmeyecekse pencere özelliklerinden gtk_window_set_resizable(GTK_WINDOW(pencere), FALSE); diyerek pencere büyütülmesini engellersin.Yada widgetler,alignmentler,ve box lar arasında boğalabilirsin :)Table yapısı benimde kafamı çokça karıştırıyor.Ama düzen için kullanılması çok gerekli bir yapı.


Evet dediğiniz gibi "fixed frame", boxing ve packing işlemlerine nazaran oldukça kolay gözüküyor. Buna yönelmek daha mantıklı duruyor şimdilik benim açımdan.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

mrti14

#15
Merhaba dostlar.Biraz daha uğraşıp bir not defteri yazdım.Tasarımı glade ile yaptım.Glade dosyasıda içerisindedir.Şifreleme ve kullanıcı adınıda daha sonra geliştireceğim.Dosya açma,yeni dosya oluşturma ve hakkında menüsü var.Statusbara da birşeyler ekleyeceğim.



Download: http://ubuntuone.com/p/MyX/

sem

Yeni paylaşım için teşekkürler...

Open ve Save fonksiyonlarını kullanamadım acaba ben mi kullanamadım? "Semetey Coşkun" yazıp "save" deyince ya da "open" deyip bir program seçtiğimde yanıt alamıyorum... Ek bir şeyler mi yapmam lazım?

Ya da sıkıntı varsa şuradan kaynaklı olabilir mi?

void dosya_ac(GtkWidget *widget){
     GtkWidget *dialog;
     dialog = gtk_file_chooser_dialog_new ("Open File",
            NULL,
            GTK_FILE_CHOOSER_ACTION_OPEN,
            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
            GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
            NULL);
     
     if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
       {
         char *filename;
         gtk_text_view_set_editable(GTK_TEXT_VIEW(textview),TRUE);
         filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (dialog));
         buf=filename;
         dosya_acildi=TRUE;
         //g_free (filename);
         printf("%s\n",filename);
       }
     
     gtk_widget_destroy (dialog);
}


Buradaki g_free iptali ya da ilk değersiz gösterici kullanımı?

Gerçi uçbirimden baktığım zaman bellek ile alakalı bir hata döndürmüyor... (segmantation fault, stack vs...)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?