Yazgaç hakkında

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.

Yeni text editörümüz “Yazgaç”

Yazgaç’ı indirmek için tıklayınız.

# -*- coding: cp1254 -*-

# Türkçe karakterlerin düzgün görünmesi için dil kodlaması belirledik
# Böyle bir belirleme yapmazsak varsayılan olarak türkçe karakterler 
# görünmeyecektir.

"""
Programı yazan:                 Aydın ŞEN

Tarih:                          9.11.2007

Kullanılan dil:                 Python

Kullanılan kütüphane:           wxPython

Açıklamalı anlatım:             www.pythonturk.com

Kullanılan lisans:              GPL (General Public License - Genel Kamu Lisansı)

** GPL şartları dahilinde kullanımı serbesttir.

"""

Continue reading “Yeni text editörümüz “Yazgaç””