4 Aralık 2009 Cuma

WxRuby İlk Uygulama

Bu yazıda adım adım iş yapan bir uygulama yapacağız. Sonunda WxRuby logosu gösteren bir penceremiz olacak.
İlk önce WxRuby ile yazılabilecek en kısa uygulamayı yapalım. Minimum.rb adında bir dosya oluşturun ve aşağıdaki kodu girin :

 1 #!/bin/env ruby
2
3 require 'rubygems'
4 require 'wx'
5 include Wx
6
7 class App
8 def on_init
9 frame = Frame.new nil, -1, "Minimum"
10 frame.show
11 end
12 end
13
14 App.new.main_loop
Fazla bir şey yokmuş. 14 satırda ekrana boş bir pencere açtık. Bu programın asıl amacı WxRuby kurulumunuzun sağlıklı olduğunu görmek. Bu programı çalıştırmak için değişik işletim sistemlerinde değişik işlemler yapmak gerekebilir ama genellikle dosyanın olduğu klasörde terminal açılır ve şu yazılır :
ruby minimum.rb
Sonuçta şu görüntü ortaya çıkar :



Şimdi bu resme bakan birçok kişi bunu bir window olarak isimlendirebilir ama WxRuby'de bu bir Frame'dir. WxRuby'de Window görüntüsü olan herşeye verilen isimdir. Diğer kütüphanelerin çoğunda bunlara Widget denir. WxRuby'de Butonlar , TextBoxlar gibi şeyler Window olarak çağırılır.
Yazılan programda her satırın bir görevi vardır. Bu basit program her WxRuby programında bulunması gereken 5 öğeyi içerir:
  • Gerekli WxRuby kütüphanesini yüklemek.
  • WxRuby uygulama sınıfını tekrar işlemek.
  • Uygulama giriş metodunu tanımlamak.
  • Uygulama sınıfının bir oluşumunu üretmek.
  • Uygulamanın ana çevrimine girmek.
Şimdi adım adım her adımın nasıl gerçekleştirildiğini inceleyelim.



WxRuby Kütüphanesini Yüklemek

İlk yapmamız gereken wx adı verilen ana WxRuby kütüphanesini yüklemek.
  require 'wx'
include Wx

İlk satır 'wx' kütüphanesini yükler, ikinci satır ise kütüphaneden her çağırdığımız sınıfın başına 'Wx::' yazısını otomatik koyar yani bir Frame üretirken 'Wx::Frame.new' yerine 'Frame.new' yeterli olacaktır.


Uygulamalar ve Frame'ler ile Çalışmak

WxRuby kütüphanesini yükledikten sonra artık uygulamayı ve içinde Frame'i oluşturabiliriz. Her WxRuby uygulamasının mutlaka bir Application(uygulama) nesnesi ve enaz bir Frame nesnesi olur. Uygulama nesnesi Wx::App sınıfının bir oluşumudur veya alt sınıfıdır. Bu sınıfın 'on_init' metodu uygulama çalışınca çağırılır.

 class MyApp <>
def on_init
frame = Frame.new nil, -1, "Minimum"
frame.show
end
end

Şeklinde App sınıfının bir alt sınıfını tanımlamak genel eğilimdir. MyApp ismini biz verdik Ruby'de geçerli herhangi bir sınıf ismi olabilir. 'on_init' metodunda genellikle Frame tanımlamaları yapılır. Ama çoğunlukla burdaki gibi Frame sınıfı değil , MyFrame gibi bir altsınıf üretilerek kullanılır.

Frame'ler birçok parametre alır. Görünen ilk parametre mecburdur ama diğerlerini yazmasak da olur default değerleri vardır.

“Show” metodu frame'i görünür yapar. Eğer bu metodu kullanmazsak frame üretilir ama görünmez. Frame görünürlüğünü bir bool parametre vererek değiştirebiliriz:


frame.show false # frame görünmez olur.

frame.show true # true yazmasak da olur default true

frame.hide # bu da false parametre vermekle aynı işi yapar yani frame görünmez olur.


Son olarak uygulama sınıfının bir oluşumu üretilecek ve uygulamanın 'main_loop' metoduna girilecek. Bu şöyle de yapılabilir.


app = App.new

app.main_loop


Hepsi bu kadar! Bir kez uygulamanın main_loop metodunu çağırdıkmı artık kontrol WxRuby'ye geçer. Bu saatten sonra artık WxRuby kullanıcının eylemlerine cevap vermeye başlar. Yani mouse tıklamalarını , tuş basılmalarını izler. Uygulamanın tüm frame'leri kapanınca main_loop metodu da biter ve uygulama sona erer.


Minimum uygulamayı genişletmek

WxRuby'ye başlangıç yapabilmek için olabilecek en kısa kodlardan birini yazdık. Aslında standart bir uygulama yaparken bundan daha yapısal davranmak gerekir. Programı bölümlere ayırarak devam etmeliyiz. Aynı programı bir de yapısal olarak düzenlenmiş şekilde yazalım. Aşağıdaki programı yazıp spare.rb olarak kaydedin.

 1 #!/usr/bin/env ruby                             -1-
2 # Spare.rb WxRuby'ye giriş için yazılmıştır. -2-
3
4 require 'rubygems'
5 require 'wx'
6 include Wx
7
8 class MyFrame < Frame -3-
9
10 end
11
12 class MyApp < App
13 def on_init
14 frame = MyFrame.new nil , :title=> "Spare" -4-
15 frame.show
16 end
17 end
18
19 if __FILE__ == $0 -5-
20 my_app = MyApp.new
21 my_app.main_loop
22 end

1 numaralı işaretin olduğu ilk satır bir shebang satırı. Bir Ruby yorum satırına benziyor, gerçekte de öyle ama linux gibi bazı işletim sistemlerinde shebang satırı işletim sistemine bu betiği çalıştırmak için kullanacağı interpreter'ı tarif eder. Bu sayede linuxta sadece komut satırında dosyanın adını yazarak çalıştırabiliriz. Yani “ruby spare.rb” yerine sadece “spare.rb” yazdığımızda betik çalışması için ruby interpreter gerektiği bilinir. Kullanıcıların ruby işini bilmelerine gerek yok sadece dosyanın adını yazdıklarında betik çalışır. Bu satır kullanılmadığı işletim sistemlerinde Bir şey ifade etmez ama cross platform uygulamalar yazmak için bu satırı koymamız gerekir.


2- nolu işaretli satırda uygulamanın Ruby dökümanı için bir dökümantasyon yorumu yazdık. İlerde bu uygulamanın rdoc ile dökümanı çıkarıldığında dökümana uygulamanın açıklaması olarak bu yorum gelecektir. Benzer şekilde her sınıf tanımından ya da metod tanımından önce gelen satırda yazılan yorumlar o metod ya da sınıfın rdoc dökümanında açıklama olarak gelir. Bundan başka rdoc dökümanının görüntüsünü wiki benzeri formatlayan yöntemler vardır.


3- Frame sınıfının bir altsınıfını kendi MyFrame sınıfımız olarak tanıttık, şimdilik hiçbir şeyi değiştirmedik. İlerde içinde butonlar textboxlar vb. olan frame tanımlamaları yapacağız. Programınızın frame'i karmaşıklaşmaya başladığında ya da birden fazla frame içeren programlar yaparken bu şekilde her frame için bir altsınıf tanımlaması yapmak programınızın anlaşılabilir olmasına yardımcı olacaktır.


4- Uygulama sınıfı içinde kendi frame sınıfımızı parametrelerle çağırıyoruz. Kendi sınıfımızın tanımında başka bir şekil belirtilmediği için Wx::Frame sınıfı ile aynı şekilde parametreleri değerlendirilir. Bir nesneden üretilen nesne yine nesnedir ve aynı şekilde parametreler alır.


5- Son bölüm bir ruby programında kullanılan genel yapılardan biridir. Bir betik iki şekilde kullanılır, ya direk olarak çalıştırılır ya da başka bir betik içine kütüphane dosyası olarak “require” ile çağırılır. Bir betiği kütüphane olarak çağırdığımızda onun içindeki sınıfları ve metodları kullanırız. Eğer bu betik tek başına çalışan bir betikse mesela bir pencere açıyorsa require komutu sonrası da çalışmaya kalkar, halbuki biz sadece içindeki sınıfları ve metodları kullanmak istiyoruz. Burdaki kalıbı kullanarak çalışmasını istemediğimiz kodları ayırıyoruz. “__FILE__” değişkeni kodun bulunduğu dosyanın adını verir, yani burada “spare.rb” değeri alır. “$0” ise aktif iş yapan betiğin adıdır. Şimdi eğer “ruby spare.rb” deyip direk bu betik çalıştırılırsa “$0” değişkeni de “spare.rb” değerini alır yani “__FILE__” değişkeni ile aynı olur. Ama diyelim bu betiği “app.rb” adındaki başka bir betiğin içinde “require spare.rb” deyip yüklediğimizde “$0” değişkeni artık “app.rb” olacaktır bu durumda if satırı içindeki kodlar çalışmayacak sadece sınıf tanımlamaları diğer betiğe yüklenecektir. Bunu yapmasaydık require ile betiği başka bir betik içine yüklemeye kalktığımızda uygulama çalışıp frame açılacaktı.


En Son Hello.rb Betiğin Üretilmesi

Şimdi artık son haline getirelim. “hello.rb” adındaki betiğe aşağıdaki satırları girelim :

 1 #!/usr/bin/env ruby
2 # Merhaba WxRuby Prgramı !
3
4 require 'rubygems'
5 require 'wx'
6 include Wx
7
8 # MyFrame bir resim gösteriyor.
9 class MyFrame < Frame
10 # Bir Frame oluşumu yap ve bir resim göster
11 def initialize(image, parent=nil, id=-1, pos=DEFAULT_POSITION, title="Merhaba WxRuby" )
12 temp = image.convert_to_bitmap
13 size = Size.new(temp.get_width, temp.get_height)
14 super parent, id, title, pos, size
15 bmp = StaticBitmap.new self, :label=>temp
16 end
17 end
18
19 # Uygulama Sınıfı
20 class MyApp < App
21 def on_init
22 image = Image.new "wxruby.png", BITMAP_TYPE_PNG
23 frame = MyFrame.new image
24 frame.show
25 end
26 end
27
28 if __FILE__ == $0
29 my_app = MyApp.new
30 my_app.main_loop
31 end
32
33
34

İlk satır shebang satırı, bu satırla Linux işletim sisteminde betik sadece adı yazılıp çalıştırılabiliyor. Frame sınıfının altsınıfını tanımlayarak frame yerleşimini ve kontrolünü daha rahat yapıyoruz. Kendi Frame sınıfımızın üretilmesine orjinalinden ayrı olarak “image” adında bir parametre daha ekliyoruz. Diğer parametreler için default değerler vererek sadece bu parametrenin yeterli olmasını sağlıyoruz. Resmimizi bir StaticBitmap içinde göstereceğiz. Bu resim boyutlarını alıp Frame nesnemizi üretirken tam bu resmi kapsayacak büyüklükte olmasını sağlıyoruz. Sonra Uygulama sınıfının bir alt sınıfını ve on_init metodunu tanımlıyoruz. Bir Image nesnesi üretip web sitesinden indirdiğimiz “wxruby.png” resmini be nesneye yüklüyoruz. Daha sonra standart bir kontrol yapıyoruz , bu betik komut satırından mı çağırıldı yoksa başka bir betik içine mi çağırıldı ?










Hiç yorum yok:

Yorum Gönder