January 06, 2017

Bu aralar biraz Gtkd öğrenmeye başladım. Yeterli derecede kaynak bulamadığım için PyGtk örneklerini D'ye aktarmaya çalışıyorum.

Örneğin şu örnek:

http://python-gtk-3-tutorial.readthedocs.io/en/latest/entry.html

Benim yazdığım D örneği de şu şekilde oldu.

import gtk.Main;
import gtk.MainWindow;
import gtk.Button;
import gtk.Box;
import gtk.Entry;
import gtk.CheckButton;
import gtk.ToggleButton;
import glib.Timeout;

class Pencere: MainWindow
{
   Box yatayKutu, dikeyKutu;
   Entry giriş;
   CheckButton düzenlenebilir, görünür, kayan;
   Timeout zamanlama;

   this()
   {
       super("Giriş örneği");
       this.setSizeRequest(200, 100);
       dikeyKutu = new Box(Orientation.VERTICAL, 6);
       ekle(dikeyKutu);

       giriş = new Entry();
       giriş.setText("Merhaba Dünya");
       dikeyKutu.packStart(giriş, true, true, 0);

       yatayKutu = new Box(Orientation.HORIZONTAL, 6);
       dikeyKutu.packStart(yatayKutu, true, true, 0);

       düzenlenebilir = new CheckButton("Düzenlenebilir");
       düzenlenebilir.addOnToggled(&düzenlenebilirSeçildi);
       düzenlenebilir.setActive = true;
       yatayKutu.packStart(düzenlenebilir, true, true, 0);

       görünür = new CheckButton("Görünür");
       görünür.addOnToggled(&görünürSeçildi);
       görünür.setActive = false;
       yatayKutu.packStart(görünür, true, true, 0);

       kayan = new CheckButton("Kayan");
       kayan.addOnToggled(&kayanSeçildi);
       kayan.setActive = false;
       yatayKutu.packStart(kayan, true, true, 0);

       showAll();
   }

   void düzenlenebilirSeçildi(ToggleButton düzenlenebilir)
   {
       auto değer = düzenlenebilir.getActive();
       this.giriş.setEditable(değer);
   }

   void görünürSeçildi(ToggleButton görünür)
   {
       auto değer = görünür.getActive();
       this.giriş.setVisibility(değer);
   }

   void kayanSeçildi(ToggleButton kayan)
   {
       if (kayan.getActive())
       {
           giriş.setProgressPulseStep(0.2);
           zamanlama = new Timeout(100,&birşeyYap, false);
       }
       else
       {
           zamanlama.stop();
           giriş.setProgressPulseStep(0);
       }
   }

   bool birşeyYap()
   {
       giriş.progressPulse();
       return true;
   }
}

void main(string[] args)
{
   Main.init(args);
   new Pencere();
   Main.run();
}

Ama acaba zamanlama nesnelerini doğru kullanımı bu şekilde mi olacak.

glib.Timeout.d sınıfının kurucu işlevi şu şekilde:

this(uint interval, bool delegate() dlg, GPriority priority, bool fireNow=false)
{
   /* ... */
}

this(uint interval, bool delegate() dlg, bool fireNow=false)
{
   /* ... */
}

Python örneğinde None geçmiş ben de false geçtim.

   self.timeout_id = GObject.timeout_add(100, self.do_pulse, None)

Burada da user_data diye bir parametre geçmiş ama neden geçmiş anlamadım.

   def do_pulse(self, user_data):
       self.entry.progress_pulse()
       return True

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 06, 2017

Python örneğindeki isimlerden tahmin ediyorum. timeout_add denen yerdeki anlam şu: Her 100 milisaniyede bir self.do_pulse'ı çağır; çağırırken de şu user_data'yı gönder. Yani oradaki None yerine herhangi bir bilgi verebileceğini ve do_pulse çağrıldığında o bilgiyi user_data olarak göreceğini sanıyorum.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]