http://esiyo.net - uordek.essiyoo.each { |yazi| esiyo.net << yazi }

Ruby ile GUI Toolkits (wxRuby)

29.01.2007, yazan Tankut ŞENTÜRK

Merhabalar,

Bu yazımızda Ruby ile GUI Toolkits başlattığımız yazı dizisine devam ediyoruz. Bugün WxRuby kütüphanesini inceleyeceğiz. WxRuby kütüphanesi oldukça gelişmiş olan wxWidgets kütüphanesi üzerine kurulu bir yapıdır. WxRuby Microsoft Windows, Mac OS X, Linux ve BSD üzerinde sorunsuzca çalışır. Kendisinin herhangi bir görüntü teması yoktur. Hangi işletim sistemine yüklenirse, o işletim sisteminin görüntü temasını kullanır. Hemen hemen tüm Ruby uygulamalarında olduğu gibi gem ile kurulumu oldukça basit ve kolaydır. Aynı zamanda Python bağlayıcısı da (wxPython) bulunan bu yapı, C++'da yazılmış olan wxWidgets kütüphanesinden güçünü alır.
Windows, Linux ve Mac OS X için kurulumu; gem install wxruby2-preview ile gerçekleşir... Linux ve Mac OS X'de 'Super User(sudo)' ile bu işlem yapılmalıdır.

Öncelikle wxWidgets kütüphanesinin gerçekten çok güçlü olduğu tekrar vurgulamakta fayda var. Bu bilgi ışığında WxRuby'nin önceki sürümlerinin çok kötü olduğunu duymuş olabilirsiniz.. duymadıysanız şimdi duydunuz, gerçekten çok kötü idi. Bunun farkına varan sevgili yazılımcı kardeşlerimiz, wxRuby2'yi ortaya çıkardılar ve geliştirmelerini bu yapı üzerinde yapmaya başladılar. WxRuby2, şu anda oldukça iyi durumda, yazılım geliştirme, biraz sonra örnekte de göreceğiniz gibi, VRuby'den zor :) fakat FxRuby'den kolay. WxRuby'nin genel ağ adresinden daha fazla bilgiye ulaşabilirsiniz.

Herzaman olduğu gibi, hemen örneğimize geçelim;

require 'wx'
include Wx

class MyForm <Frame
  def initialize(title, position, size, style = DEFAULT_FRAME_STYLE)
    @title = title
    super(nil, -1, title, position, size, style)

    # 'Exit' isimli button oluşturulur..
    close = Button.new(self, 10, "Exit", Point.new(230, 125), Size.new(70, 40))
    evt_button(10) { on_close() }
   
    # 'Hello !' isimli button oluşturulur..
    sayHello = Button.new(self, 20, "Hello !", Point.new(100, 125), Size.new(70, 40))
    evt_button(20) { on_sayHello() }
   
    # 'Username' isimli text alan oluşturulur..
    userNamelbl = StaticText.new(self, -1, "Username :", Point.new(100, 75))
    @userName = TextCtrl.new(self, -1, "", Point.new(160, 75), Wx::Size.new(150,-1))
  end
 
  def on_close()
    dlg = MessageDialog.new(self, "Are you sure ?", @title, OK | CANCEL | ICON_INFORMATION)
    result = dlg.show_modal()
    dlg.destroy() # her durumda kapatılması gerektiği için, Close()'un önünde yapılmalıdır.
    close() if result == Wx::ID_OK
  end
 
  def on_sayHello()
    dlg = MessageDialog.new(self, "Hello, #{@userName.get_title}!", @title, OK | ICON_INFORMATION)
    dlg.show_modal()
    dlg.destroy()
  end
end

# Sadece on_init (başlangıç)  ve on_exit (bitiş) bölümleri ezilir.
class MyApplication <App
  def on_init() # Uygulama oluşturulurken
    puts "Application starting.."
   
    # Kendi yazdığımız form çağrılır.
    myForm = MyForm.new('Uordek WxRuby Test Form', 
                    Point.new(100, 100), Size.new(400, 250))
    set_app_name('wxRubyByUordek')
    myForm.show() # Ekranda gösterilir.
  end
 
  def on_exit() # Uygulama kapatılırken.
    puts "Application closing.."
  end
end

begin
    # Uygulama 'new' ile yaratılır.
    app = MyApplication.new
    app.main_loop() # İşletim sistemi ile mesaj alış verişine başlar.
ensure
    GC.start # Ruby'nin Garbace Collector'ü çağrılır.
end

Örnekte görüleceği gibi, Point ve Size nesneleri ile başlangıç koordinatları ile genişlik ve yükseklik bilgilerini belirledik. Bu işlemi bu şekilde yapabileceğimiz gibi, Tk+ veya Fox'da olduğu gibi Html'e benzer biçimde de yapabiliriz. Aslına bakarsanız tercih edilen yöntem bu fakat ben işin kolayına kaçtım diyebiliriz :).

Kolay gelsin...

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails)

2 Yorum

  1. ujk

    bende “@userName.get_title” çalışmıyor. “@userName.get_value” çalışıyor.

  2. Tankut ŞENTÜRK

    Verdiğin bilgi için teşekkür ederim. Düzelteceğim.

    Ben bu yazıyı yazdığım zamanlarda wxruby bayağı düşük bir sürümde idi, şimdi versiyonu 1.9.2 arada bu şekilde küçük farkların olması normal.

Yaz aklındakini, çekinme :)

Lütfen: Yorumunuzun değerlendirilmesi ve yayınlanması uzun sürebilir. Yorumunuzu tekrar göndermeniz için bir neden yoktur, inanın tüm yorumları yayınlıyorum. Bazıları hariç :).