Python ile Gnome Uygulamaları Geliştirmek (Bölüm 2)

ArticleCategory: [Choose a category, do not translate this]

Software Development

AuthorImage:[Here we need a little image from you]

Hilaire Fernandes

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in fr Hilaire Fernandes

fr to de Günther Socher

de to en Guido Socher

en to tr Bülent Özdemir

AboutTheAuthor:[A small biography about the author]

Hilaire Fernandes, Gnome projesi kapsamında eğitim için bedava yazılım geliştiren OFSET adlı organizasyonun başkan yardımcısıdır. Aynı zamanda, dinamik geometri için kullanılan Dr. Geo isimli yazılımı geliştirmiştir. Halen, Gnome projesi kapsamında, eğitim amaçlı, Dr. Genius isimli bir başka matematik yazılımı üstünde çalışmaktadir.

Abstract:[Here you write a little summary]

Bu yazı serisi, esas olarak, Gnome ve GNU/Linux alanında yeni başlayan programcılar içindir. Programlama dili olarak Phyton seçilmiştir, çünkü yeni başlayan programcılar bu dile, C gibi derleme yapılması gereken dillerden çok daha hızlı girebilmektedirler. Bu makaleyi anlayabilmek için, Phyton un bazı programlama temellerini bilmeniz gerekmektedir.

ArticleIllustration:[This is the title picture for your article]

Gnome

ArticleBody:[The article body]

Gerekli Araçlar

Gösterilen programı çalıştırmak için gerekli yazılım, bu serinin ilk yazısında listelenmiştir.

Aynı zamanda şunlara da gereksiniminiz olacaktır:

Kurulum işlemi ve Python-Gnome'un LibGlade ile birlikte kullanımı hakkında bilgi, yine bu yazı serisinin ilk bölümünde bulunabilir.

Drill(Desteğimiz)

İlk yazının amacı, Gnome, Glade, LibGlade ve Python kullanarak yapılandırım için yazılan bir programın bileşenleri arasındaki mekanizmayı ve etkileşim kiplerini göstermekti.

Örnekte GnomeCanvas widgeti kullanılmıştır. Bu örnek bize renkli bir sunum sağladıgı gibi bu yapılandırım ile program geliştirmenin ne kadar kolay olduğunu gösterir.

Takip eden bölümler için, Gnome'un değişik widgetlerini açiklayacağımız bir işçerçevesi içerisinde çalışmanızı öneririm. Daha sonraki yazılar, Gnome'un birçok widgetini göstermek için daha fazla özellik ekleyerek bu işçerçevesini kullanmaktadır.

İşçerçevemizin adı Drill dir. Bu eğitim amaçlı kullanılan bir ortamdır ve bizim örnek ve alıştırmalarımızda da kullanılacaktır. Bu örnekler, widgetlerinin kullanışını gösteren tamamen eğitim amaçli örneklerdir.

Glade ile arayüz oluşturmak

Widgetler

Uygulama penceresi Glade ile oluşturulur. İlk yazıda olduğu gibi, ilk önce Gnome uygulaması için bir pencere oluşturmalısınız. Bu pencereden gereksiz ikonları ve menüleri silmelisiniz.

Drill in ana parçasi GtkPanedwidget'i kullanılarak iki çalişma alanına bölünür.

[Drill window]
1. Şekil - Drill ana pencersi

İki çalışma alanın boyutlarını ayarlamak için kullanılan bir tutamak ile, dikey olarak ikiye ayrılır. Soldaki çalışma alanı, alıştırmanın değişik parçalarının sınıflarına göre depolandığı (GtkTree) adı verilen bir ağaç yapılı widget'i içerir. Sağdaki çalışma alanı boştur. Burası, kullanıcının seçeneğine göre alıştırmaları ekleyeceğimiz yerdir.

Glade'den,Drill'in arayüzünü incelemek, onun bileşenlerinin yapısını daha yakından görmemizi sağlar.

[widgets in tree]
2. Şekil - Drill'in ağ görünümü

2. Şekilde de gördüğünüz gibi hpanedTree widget'i( GtkPaned tipinde) sadece tek bir widget -- frame2 (GtkFrame tipinde) içerir (solda bulunan). frame2 exerciceTree widget'ini içerir. İlk önce GTK_SHADOW_IN gölgesi tipinde bir GtkFrame widget'inin GtkPaned widget inin içine konulması tercih edilir. Bu tutamağın maskelenmesini önler.

Son olarak, Gnome haberleşme kutusu "About Drill" şöyle görünecektir.

[Dialog window]
3. Şekil - Haberleşme kutusu "About" Drill

Onun değişik parçaları, Glade tarafında Properties penceresinin Widget seçeneğinden değiştirlebilir.

Widgetler ve işlemci fonksiyon isimleri

Aşağidaki isimleri, bu widgetleri Pythton ile bu isimler altında değişiklikler yapmak amacıyla kullanınız.

Gnome uygulama penceresi:
drillApp
Alıştirmalar ağacını ayıran tutamak :
hpanedTree
Alıştırmalar ağacı:
exerciceTree
Gnome hakkında haberleşme kutusu :
about

Bu widget isimlerini 2. Şekilde de görebilirsiniz.

Burada, işlemci fonksiyonlarının ismini hızlıca listeliyoruz. Bu konuda daha fazla bilgi istiyorsanız, bu yazı serisinin birinci bölümünü okuyabilirsiniz.

Widget Adı Signal İşlem
about clicked gtk_widget_destroy
about close gtk_widget_destroy
about destroy gtk_widget_destroy
button1 (Araç çubuğundaki
yeni tuş)
clicked on_new_activate
new activate on_new_activate
drillApp destroy on_exit_activate
exit activate on_exit_activate
about activate on_about_activate

Son ayarlamalar

Glade ile widgetlarin geometrisini ayarlamak mümkündür. Bizim orneğimizde, properties panelinin Common tabını kullanarak, drillApp in boyutunu 400*300 e ayarlayabilirsiniz. Ayrica, yatay bölenin yerini 1 yerine 100 e ayarlayabilirsiniz.

Şimdi, exerciceTree widgeti bir anda bir seçime izin verecek şekilde yaralanmalıdır. Aslında, bir anda bir alıştırma seçilebilir. properties panelinden, Selection->Single i seçiniz. Bu widget için diğer seçenekler daha az onemlidir.

Harika! Drill için hepsi bu kadar. Gelecek yazıda alıştırmalar geliştirmeye başlayacağız. Şimdilik, arayüzü Python'dan kullanmayı ve GtkTree widgetinin nasıl değiştirilebileceğini görelim.

Python kodu

Kaynak kodun tamamı bu dökümanın sonunda bulunabilir. Kaynak kodu drill.glade dosyası ile ayni dizine kaydetmelisiniz.

Gerekli modüller

from gtk import *
from gnome.ui import *
from GDK import *
from libglade import *

LibGlade ile grafik arayüzü

LibGlade ile grafik arayüzü geliştirmek ve işlemlerin bağlantısı bir önceki örnekte olduğu gibi yapılmaktadır. Bu konuya tekrar geri dönmeyeceğiz.

Python programında global değişkenlerin tanımlanması:

Ağaç LibGlade ile oluşturulur ve ağcın işretleyicisi aşağıdaki çağırımla elde edilir:

exerciceTree = wTree.get_widget ("exerciceTree")

Yatay panellerin işaretleyicilerine de gereksinimimiz var. Aslında iki yatay panelin container referansları(GtkPaned)bir tutamak ile ayrılmıştır. Soldaki ağacı, sağdaki alıştırmaları içerir. Şimdi etiketi oraya koyacağız:

   paned = wTree.get_widget ("hpanedTree")
   label = GtkLabel ("No exercise selected")
   label.show ()
   paned.pack2 (label)

Birkez daha, GTK+ Reference manual -- GtkLabel ve GtkPaned nesneleri hakkında -- ve Python kaynak kodu /usr/lib/python1.5/site-packages/gtk.py size nesnelerin doğru kullanımları için gerekli olacaktır.

GtkTree widgeti

Şimdi yazının en önemli kısmına geldik: GtkTree tipindeki ağacın kullanımı.

Ağaç addMathExercices(), addFrenchExercices(), addHistoryExercices() ve addGeographyExercices() fonksiyonlarının ard arda cağırımları ile doldurulur. Bu fonksiyonlar birbirlerine çok benzerler. Herbiri yeni bir alt sınıf (alt ağaç) ve alıştırmaların isimlerini ekler:

def addMathExercices ():
   subtree = addSubtree ("Mathematics")
   addExercice (subtree, "Exercise 1", "Math. Ex1")
   addExercice (subtree, "Exercise 2", "Math. Ex2")

Altağaç

def addSubtree (name):
   global exerciceTree
   subTree = GtkTree ()
   item = GtkTreeItem (name)
   exerciceTree.append (item)
   item.set_subtree (subTree)
   item.show ()
   item.connect ("select", selectSubtree)
   return subTree

Varolan bir ağaçta alt bir ağaç oluşturmak için iki şey yapmanız gerekmektedir: altağacın ismiyle bir GtkTree ağacı ve GtkTreeItem maddesi oluşturmak. Daha sonra madde köke -- bütün sınıfları içeren ağaç -- eklenir ve set_subtree() fonksiyonu kullanarak altağaç maddeye eklenir. Son olarak select olayı maddeye bağlanır, böylece, sınıf seçildiğinde, selectSubtree() fonksiyonu çağırılır.

GtkTreeItem

def addExercice (category, title, idValue):
   item = GtkTreeItem (title)
   item.set_data ("id", idValue)
   category.append (item)
   item.show ()
   item.connect ("select", selectTreeItem)
   item.connect ("deselect", deselectTreeItem)

Maddeler başlık olarak alıştırma isimlerini kullanılırlar Exercice 1, Exercice 2, ... gibi. Her maddeye ek bir id özelliği ilişkilendirilir. GTK+, GtkObject tipindeki her nesneye --her GTK+ widgeti ondan gelir -- bazı özellikler ekleme olasılığı vardır. Bunu yapabilmek için iki fonksiyon vardır; set_data (key, value) ve get_data (key) bir özelliğe ilk değeri vermek ve değerini almak için kullanılır. Madde daha sonra kendi sınıfına eklenir -- bir altağaç. Görüntüyü sağlamak için onun show() fonksiyonu çağırılır. Son olarak, select ve deselect olayları bağlanır. deselect olayı madde üzerindeki seçim kalktığında aktif olur. Sırasıyla, madde üzerindeki seçim kalktığı zaman deselectTreeItem() fonksiyonu, sonra seçilen madde için selectTreeItem() fonksiyonu çağırılır.

İşlemci fonksiyonlar

Şu ana kadar üç işlemci fonksiyonu tanımladık :selectTreeItem(), deselectTreeItem() ve selectSubtree(). Bu fonksiyonlar metin etiketini -- sağ tarafta -- id özelliği ile güncellerler. Şimdilik bu kadar.

Son söz

Biz sadece, alıştırmaları (yeni keşfedilen widget kadar) ekleyeceğimiz içsel yapıyı kurduk. Temel olarak GtkTree widgetini ve widgetlere özellik etmeyi inceledik. Bu mekanizma, burada yaptığımız gibi, sıklıkla işlemci fonksiyonlardan ilişkili bilgileri almak için kullanılır. Gelecek yazıya kadar, birinci bölümde kullandığımız Couleur oyununu, Drill de bir alıştırma olarak, değiştirmeyi deneyebilirsiniz.

Appendix: Kaynak kodun tamamı

#!/usr/bin/python
# Drill - Teo Serie
# Copyright Hilaire Fernandes 2001
# Release under the terms of the GPL licence
# You can get a copy of the license at http://www.gnu.org from gtk import *
from gnome.ui import *
from GDK import *
from libglade import * exerciceTree = currentExercice = label = None

def on_about_activate(obj):
    "display the about dialog"
    about = GladeXML ("drill.glade", "about").get_widget ("about")
    about.show ()

def on_new_activate (obj):
    global exerciceTree, currentExercice

def selectTreeItem (item):
    global label
    label.set_text ("L'exercice " +
             item.get_data ("id") + "est sélectionné.")

def deselectTreeItem (item):
    global label
    label.set_text ("L'exercice " +
             item.get_data ("id") + "est désélectionné.")

def selectSubtree (subtree):
    global label
    label.set_text ("No selected exercise")

def addSubtree (name):
    global exerciceTree
    subTree = GtkTree ()
    item = GtkTreeItem (name)
    exerciceTree.append (item)
    item.set_subtree (subTree)
    item.show ()
    item.connect ("select", selectSubtree)
    return subTree

def addExercice (category, title, id):
    item = GtkTreeItem (title)
    item.set_data ("id", id)
    category.append (item)
    item.show ()
    item.connect ("select", selectTreeItem)
    item.connect ("deselect", deselectTreeItem)

def addMathExercices ():
    subtree = addSubtree ("Mathématiques")
    addExercice (subtree, "Exercice 1", "Math. Ex1")
    addExercice (subtree, "Exercice 2", "Math. Ex2")

def addFrenchExercices ():
    subtree = addSubtree ("Français")
    addExercice (subtree, "Exercice 1", "Français Ex1")
    addExercice (subtree, "Exercice 2", "Français Ex2")

def addHistoryExercices ():
    subtree = addSubtree ("Histoire")
    addExercice (subtree, "Exercice 1", "Histoire Ex1")
    addExercice (subtree, "Exercice 2", "Histoire Ex2")

def addGeographyExercices ():
    subtree = addSubtree ("Géographie")
    addExercice (subtree, "Exercice 1", "Géographie Ex1")
    addExercice (subtree, "Exercice 2", "Géographie Ex2")

def initDrill ():
    global exerciceTree, label
    wTree = GladeXML ("drill.glade", "drillApp")
    dic = {"on_about_activate": on_about_activate,
        "on_exit_activate": mainquit,
        "on_new_activate": on_new_activate}
    wTree.signal_autoconnect (dic)
    exerciceTree = wTree.get_widget ("exerciceTree")
    # Temporary until we implement real exercice
    paned = wTree.get_widget ("hpanedTree")
    label = GtkLabel ("No selected exercise")
    label.show ()
    paned.pack2 (label)
    # Free the GladeXML tree
    wTree.destroy ()
    # Add the exercices
    addMathExercices ()
    addFrenchExercices ()
    addHistoryExercices ()
    addGeographyExercices ()

initDrill ()
mainloop ()