Bir başka dünyadır Python..

PythonTurk

Yazgaç hakkında

11 Kasım 2007 gönderen pythonturk.

Yazgaç bizi halihazırda kullandığınız text editörden vazgeçirecek özelliklere sahip değil, o amaçla da yazmadım zaten. GUI olarak wxpython kullanan arkadaşlara faydalı olması ve genel python kullanımına örnek olması için yazdım. Programda bazı eksiklikler mevcut. Bir zaman sonra bunlarla uğraşamadığım, bir kısmını ise araştırdığım halde çözemediğim için bu şekliyle yolladım.

Belirlediğim eksikleri:

  

* Program ilk açıldığında düzen menü elemanlarından ve toolbar elemanlarından "kes, kopyala, yapıştır, sil" gibi öğelerin pasif olması gerekiyor. Pasif olması için gerekli kod basit ancak hangi durumda pasif olacağını ayarlamak güç oldu. Editörden herhangi bir metin seçildiği takdirde o elemanların aktfi olması gerekiyor, bunu kontrol etmekte kolay, editörden metin seçilip seçilmediği kontrol edilebilir, ancak o kodun her seçimde çalışması için bir EVENT’i vardır diye düşünüyorum, ben kurcaladım biraz bulamadım. Bilen arkadaşlar paylaşırsa güncelleriz o kısmını. Mesela "geri al" menü elemanını kontrol edebiliyorum onun durumu biraz farklı olduğu için düzenlemek sorun olmadı, onun kontrolü için özel bir EVENT’e gerek yok.

 15 Kasım 16:21 de gelen düzeltme:

Yukarıda belirttiğim eksikliği bir timer tanımlayarak çözdüm. init() metodu içinde 100 milisaniyede bir çalışan bir timer tanımlıyoruz. Timer 100 milisaniyede bir timer’ı oluştururken belirlediğimiz metodu çalıştırıyor. O metodta GetSelection metodu ile ekranda seçili öğe olup olmadığını kontrol ediyoruz, seçili öğe varsa o elemanları aktif, seçim yoksa pasif yapıyoruz.

Eklediğim kod şu şekilde:

__init__ metodunda herhangi bir yere aşağıdaki kodu ekliyoruz.

self.timer=wx.Timer(self,-1)
self.timer.Start(100)
wx.EVT_TIMER(self,self.timer.GetId(),self.ontimer)

daha sonra ontimer() metodunu ekliyoruz.

def ontimer(self,evt):
        ilk,son=self.metinAlani.GetSelection()
        if ilk==son:
             self.menuBar.Enable(ID_SIL,False)
             self.menuBar.Enable(ID_KES,False)
             self.menuBar.Enable(ID_KOPYALA,False)

            
             self.toolbar.EnableTool(ID_SIL,False)
             self.toolbar.EnableTool(ID_KES,False)
             self.toolbar.EnableTool(ID_KOPYALA,False)
        else:
            self.menuBar.Enable(ID_YAPISTIR,True)
            self.menuBar.Enable(ID_SIL,True)
            self.menuBar.Enable(ID_KES,True)
            self.menuBar.Enable(ID_KOPYALA,True)

            self.toolbar.EnableTool(ID_YAPISTIR,True)
            self.toolbar.EnableTool(ID_SIL,True)
            self.toolbar.EnableTool(ID_KES,True)
            self.toolbar.EnableTool(ID_KOPYALA,True)
       
           
        if self.metinAlani.CanPaste():
            self.toolbar.EnableTool(ID_YAPISTIR,True)
            self.menuBar.Enable(ID_YAPISTIR,True)
        else:
            self.toolbar.EnableTool(ID_YAPISTIR,False)
            self.menuBar.Enable(ID_YAPISTIR,False)

 

Not: Sitedeki kod ve programın tamamının bulunduğu dosya güncellenmiştir.

* Bir diğer önemli sorun ise program ilk başladığında boş bir sayfayla başlaması. Bu benim yazdığım şekli, bunda bir sorun yok. Sorun şurda çıkıyor; mesela programı py2exe ile exe’sini oluşturdunuz ve txt uzantılı bir dosyayı Yazgaç’la açılması için ayarladınız, ama açılmadı. Çünkü açılışta böyle bir kontrol yapılmıyor. Bu işi yapmak için sys.argv kullanmak gerektiğini düşünüyorum. Ancak biraz kurcaladım bu işi görecek şekilde düzenleyemedim. Bu da düzeltilmesi gereken bir sorun.

 

 

* Programı yazdıktan sonra FontDialog konusunda da bir eksiklik olduğunu farkettim. Herşey iyi güzel çalışıyorda yazının rengi değişmiyor mesela. Onun için ayrıca birşeyler ayarlamak gerekli sanırım.

 
 

* Programa "bul" özelliği de eklenebilir.

 
 

Benim farkettiğim eksiklikler bu kadar, illa ki başka eksiklikleri de vardır. Ama dediğim gibi amacım çalışan, kullanılabilir bir program yazmak değil, sadece örnek teşkil etmesi, amacım öyle bir program yazmak olsaydı daha özen gösterirdim, ancak şu an böyle birşey için gerek de görmüyorum, vaktim de yok. 

 

Programda sitede anlatacağımı söylediğim menuYap() metodundan bahsedeyim biraz. Programı yazarken menü elemanlarını oluşturmak için aynı kodu ufak tefek farklarla defalarca yazdığımı farkettim ve bunu bir metodla halletmeye karar verdim. 

 

def menuYap(self,menuAdi,menuParam,fParam,idParam):

        menu=wx.Menu()
        sayac=0

        for i in menuParam:
            if i=="sep":
                menu.AppendSeparator()
                continue
            else:
                item=menu.Append(idParam[sayac],i,kind=wx.ITEM_NORMAL)
                self.Bind(wx.EVT_MENU,fParam[sayac],item)
                sayac=sayac+1
        self.menuBar.Append(menu,menuAdi)       

 

Metodu şu şekilde çağırıyoruz: 

        dosyaMenu=["Yeni\tCTRL+N","Aç\tCTRL+O","Kaydet\tCTRL+S","Farklı Kaydet","sep","Çık"]
        dosyaFonksiyon=[self.yeni,self.ac,self.kaydet,self.farkliKaydet,self.cik]
        dosyaID=[ID_YENI,ID_AC,ID_KAYDET,ID_FKAYDET,ID_CIK]
        self.menuYap("&Dosya",dosyaMenu,dosyaFonksiyon,dosyaID)

 

Öncelikle metodun aldığı parametrelere bakalım.

menuAdi= Menünün adını içeren string bir değişken içeriyor. Mesela "Dosya". 

menuParam= Bu parametre menü elemanlarına vereceğimiz label (etiket) leri içeriyor. 

fParam= Bu parametre menü elemanına tıkladığımızda çağrılacak metodları içeriyor. Değişken bir liste ve listenin elemanları metodlardan oluşuyor. 

idParam= Menü elemanlarına vereceğimiz ID’leri içeriyor. Menü elemanlarını gerekli yerlerde aktif/pasif yapabilmek için ID tanımladık. 

Metod ilk olarak bir "menu" adında bir menü nesnesi oluşturuyor. Daha sonra for döngüsüyle menuParam içerisindeki elemanları teker teker geziyoruz. menuParam içindeki değerlere "i" üzerinden ulaşıyoruz. Öncelikle menuParam içerisinde "sep" değeri varmı diye kontrol ediyoruz. Eğer i değişkenimiz "sep" değerine eşitse bir separator(ayırıcı) eklememiz gerektiğini anlıyoruz. Burada önemli nokta continue komutudur. Bu komut döngüyü orada keserek başa döndürür ve döngü bir sonraki değer için tekrar döner. 

Eğer "sep" değeri gönderilmişse seperator eklememiz gerekiyor, ondan sonraki kod menüye menü elemanı eklemek için, separator için menü elemanı eklemeyeceğimiz için döngüyü bir sonraki değer ile dönmesi için başa gönderiyoruz. Eğer değerimiz "sep" değilse bu demektirki menü elemanı oluşturacağız. else bloğu içerisindeki kodlar bu işi yapıyor. 

İlk olarak menüye elemanımızı ekliyoruz ve "item" değişkenine atıyoruz. Append metodundaki parametreler şöyle: 

idParam[sayac]= idParam parametresi ile gelen değerlerden sayac indisinde olan değeri alıyor, sayac değeri 0′dan başlayıp fParam veya idParam indisine kadar gidiyor. 

Metod yukarıdaki çağırımla ilk çalıştığında ilk değeri ID_YENI’dir.

i= menuParam parametresi ile gelen menü elemanının adını içeriyor. 

Metod yukarıdaki çağırımla ilk çalıştığında ilk değeri "Yeni" dir. 

kind=wx.ITEM_NORMAL ise menü elmanının normal özellikte olduğunu söylüyor. wx.ID_CHECK gibi değişik özellikleri mevcut. 

Bir sonraki kodda ise menü elamanına olay atıyoruz. 

Bind metodunun parametreleri:

wx.EVT_MENU= menü olayının adı, menüye tıklanma olayı. 

fParam[sayac]= fParam parametresinin sayac indisinde içerdiği metodu verir.

Metod yukarıdaki çağırımla ilk çalıştığında ilk değeri self.yeni’dir

item değişkenini yukarıda belirtmiştik.  

Menüye bir eleman eklediğimiz için sayac değerini 1 arttırıyoruz. 

Son olarak init metodunda oluşturmuş olduğumuz menuBar’a menümüzü ekliyoruz. 

 

Umarım açıklayıcı olmuştur.

 

Bu arada gui kütüphanesi olarak wxpython kullanmayacağım. QT kullanmayı düşünüyorum. Açıkçası wxpython kullanırken çeşitli sıkıntılar yaşadım, qt’nin bunları yaşatmayacağını umuyorum.

Kalın sağlıcakla. 

Kategori python örnek

14 Yorum

  1. Orçun Says:

    Program sınıf yapısını kavrama açısından çok başarılı yalnız wxpython en iyi GUI olmasının yanında biraz zorlayıcı ve Linux üzerinde kurulumu işkence gibi ben beceremdim. Tkinter gibi hazır gelen bir GUI aracını kullanman hem rahat çalıştırabilme hem de yapıyı kavrama açısından yeni başlayanlara faydalı olurdu. Bir de Türkiye’de doğru dürüst bir python paylaşım platformu yok site blog gibi değil de biraz daha paylaşıma müsait bir yapıda olursa (forum değil) herkes düşüncelerini kodlarını paylaşabilir ortak projeler geliştirilebilir. Python dünya da çok yaygın ama ülkemizde bilgisayar mühendisleri python ne yenir mi? diyor (bknz:http://www.tiobe.com/tpci.htm)
    Kaliteli bir python tartışma platformuna ihtiyacımız var bence.

  2. pythonturk Says:

    Merhaba Orçun.
    Programı ilk yazmaya başladığımda senin de bahsettiğin sebeplerden dolayı Tkinter ile yazıyordum. Ancak Tkinter’ın uygulamalarda kullanılmadığı malum. Yazdığım örneğin iş görür bir şey olması için gerçek bir uygulamada kullanılabilecek olan wxPython’u tercih ettim. Tkinter ile wxPython arasındaki fark metod isimleri, aldığı parametreler vs. Python’un genel mantığı açısından bir fark oluşturmadığını düşündüğümden böyle bir değişiklik yaptım. Örnekte elimden geldiğince açıklamaya çalıştım kodları umarım faydalı olmuştur.

    Sitenin durumuna gelince, açıkçası siteyi ilk açtığım günden beri aklımda olan bir şeydi siteyi django veya turbogears ile tasarlamak. Ancak bir türlü fırsatım olmadı üzerinde çalışmaya. Şu an için son sınıf olduğumdan dolayı bitirmem gereken bir çok projem var. Bunlardan bir tanesi de php ile web portal tasarımı. Bu proje ödevimi kendi sitem üzerinden yapıyorum, yani siteyi sizinde belirttiğiniz forma dönüştürmeyi planlıyorum. Dediğiniz gibi sadece benim değil kullanıcılarında aktif olduğu bir site tasarımı yapmaktayım, umarım en kısa zamanda geçişi sağlarım.

    Linux ve wxPython konusunda hangi linux dağıtmını kullandığınızı belirtirseniz yardımcı olmaya çalışırım.

  3. neXus Says:

    Wordpress’in bbpress adında bir forum eklentisi var kolayca forum kurabilrisin istersen.. Ama öyle gelişmiş birşey değil kendisi.. şimdilik iş görebilir. bbpress örneği : http://www.wordpress-tr.com/forum/ indirmek için : http://www.wordpress-tr.com/bbpress

  4. Orçun Says:

    Suse kullanıyorum yalnız linuxa kaynak koddan yükleme mevzusundan bahsediyorum herhangi bir paket yüklemeden.Windowsta çalıştırabiliyorum zaten. Ama herkesin Linux dağıtımını birbirinden farklı olabilir. Klasik yükleme metodu sırasında (python setup.py install) hata veriyor ben de. Diğer dağıtımlarda da aynı sorun yaşanabilir diye düşündüm.

  5. pythonturk Says:

    neXus, eklentiyi duymamıştım daha önce iş görür bişeye benziyor ancak siteyi yakın zamanda değiştireceğim için şimdilik gerek yok diye düşünüyorum.

    Orçun, Suse kullanmadım hiç açıkçası, anlamadığım neden kaynak koddan derlemeye çalışıyorsun, depoda paketi yok mudur?
    Bildiğim kadarıyla çoğu dağıtımda python kurulu geliyor aslında, o yüzden tekrar kurmak gerekmiyor.

  6. Orçun Says:

    Foruma artı olarak bazı büyük projelerin ve modüllerin tutoriallerinin türkçeye çevrildiği belgeler eklemek çok faydalı olur sitenin pythonla yapılması ise pythonu tanımayan insanlar için bir güven belirtisi olur ve kendimizi de geliştirebiliriz.Bir elin nesi var iki elin sesi var .Python ile güzel bir web sitesi hazırlamak için gönüllü olanlar ile hep birlike işin ucundan tutabiliriz…

  7. neXus Says:

    evet bencede site python ile yapılsa daha iyi olur :) django ile yapılan zangetsu kullanılabilir veya baska bi site yapılabilir diyeceğim ama python destekli hostinge gecmen gerekecek galiba.. python destegi var mı ya bizim hostingin ? simdilik boyle kalabilir gibi :P

  8. pythonturk Says:

    Orçun, aslında söylediklerin çok mantıklı daha öncede belirttiğim gibi baştan beridir benimde yapmayı planladığım şeyler ancak şu anki durumum maalesef ki buna müsait değil. Şu an bitirmem gereken projelerden buna vakit ayırabileceğimi zannetmiyorum. Php projem bitince site ihtiyacımızı karşılayacak duruma gelecek diye düşünüyorum, ilk fırsatta python tabanlı şekle dönüştürebiliriz. Ayrıca ilginiz için teşekkür ederim.

    nexus, hostingimi değiştirmem gerekecek o durumda :)
    Bu arada önerilerin için sağol, umarım uygulama fırsatı da buluruz..

  9. Uğur SAMSA Says:

    Şu anki hosting firman o desteği sana sunar Aydın. Merak etme. Müşterilerimizin memnuniyeti için elimizden ne geliyorsa yapmaya hazırız. Saygılarımla;
    Ugurs Web Hizmetleri :D

  10. demo Says:

    Örneğiniz ve ayrıntılı açıklamalarınız için teşekkürler. Benim gibi python ile yeni ilgilenmeye başlayanlar için oldukça güzel bir kaynak olmuş.
    Yazgaç örneğiniz üzerinden wind(f)os altında çalıştırılabilir dosya (.exe) ya da kurulum yapılabilir bir dosya (setup vb.) hazırlamayı da örneklemeniz mümkün mü?
    Denemelerimde wxPython’da bazı sınıfların bulunamadığına dair hata alıyorum (henüz çözüm bulamadım).
    Vista altında, Python 2.5.1.1 (ActiveState ActivePython 2.5), wxPython 2.8.7.1 (unicode) ve py2exe 0.6.6 kullanıyorum; düzenleyici olarak da SciTE kullanıyorum.

  11. Prefabrik Says:

    eyvallah eline koluna sağlık on numara olmuş.

  12. hekimboard Says:

    evet bencede site python ile yapılsa daha iyi olur

  13. fibercement Says:

    on üzerinden on..teşekürler.

  14. güvenlik Says:

    çok güzel yazmışsın teşekürler.

Yorum yapın

Uyarı: İlk yorumlar onay için bekletilmektedir. Yorumlarınız en kısa zamanda incelenecektir.