Adam asmaca

Uzuuun bir aradan sonra tekrar birlikteyiz. Buraya her yazdığımda utanıyorum nedense. Bir önceki yazının üzerinden uzun bir süre geçmiş oluyor çünkü. Ama utanıyorum bu size bir anlam ifade ediyordur umarım :)

Tezimin içinde kullandığım bir oyundu adam asmaca. Kodu satır satır açıklamayacağım. Önemli gördüğüm yerlerde açıklama satırları kullandım. Uygulamayı Nokia 6300′da denedim sorunsuz çalışıyor. Kendi telefonunuzda canvas çizimlerinde kaymalar olursa (-ki olacağını sanmıyorum oranlama yapacak şekilde ayarladım) koordinatları ona göre değiştirirsiniz.

Kullandığım teknolojiler:

  • IDE: NetBeans (mobil pack)
  • OS: Pardus
  • Dil: Java(J2Me)

Kodlar çok uzun olduğu için buraya koymayacağım, jar dosyasını (telefonunuza kuracağınız dosya) buradan, kaynak kodunu (ek dosyalarla birlikte) buradan indirebilirsiniz.

j2me için ne gerekli?

Merhaba. Ne zamandır j2me ile ilgili bir şeyler yazmak istiyordum. Bugün tam yazmaya karar verdim daha sonra j2me ile ilgili giriş seviyesinde bir şey yazmadığımı fark ettim. Bu yazıyı da o açığı gidermek için yazıyorum. Ancak fazla uzun tutmak niyetinde değilim. J2me ile programlama yaparken neleri kullandığımdan bahsedip asıl yazmak istediğim yazıya uzun bir atlama yapmak istiyorum.

J2me ile program yazarken NetBeans idesini kullanıyorum.

Kullandığım temel özellikleri:

  • Görsel tasarım (visual design)
  • Hata ayıklama (debugger)
  • Kod tamamlama (code completion)

Buradan son sürümünü indirip kurabilirsiniz.

* Pardus kullanıyorsanız ve kurulumda hata ile karşılaşıyorsanız, kuruluma geçmeden önce konsolda

LC_ALL=C

komutunu verip kurmayı deneyin.

Girişi yaptık ya gerisi gelir artık, zor olanı hallettik :)

Diğer yazıda görüşmek üzere, bu arada siz de Özgür Kalın..

Ev yapımı şifreleme

lock-and-key-icon-thumb355812Merhaba.Bugün size Python ile ev yapımı şifreleme nasıl yapılır ondan bahsedeceğim. Ev yapımı şifrelemeden neyi kastettiğimi yazının devamında daha rahat anlayacaksınız.(Not: Yazar girişte başlığı kullanarak merak uyandırmaya çalışmış ve okuyucuyu yazının devamını okuması için teşvik etmeye çalışmıştır).Programı görmeden önce size bu programı nerede kullanabileceğinizden bahsedeceğim, programın bu bilgiyle incelendiğinde daha kolay anlaşılacağını düşünüyorum.

Bir uygulama geliştirdiniz. Uygulamanız kullanıcı adı ve şifre girişi gerektirmekte ve siz de bu kullanıcı adını ve şifreyi kullanıcının bilgisayarında tutmak durumundasınız. Sadece bir kullanıcının kullanıcı adı ve şifresini tutmak içinde veritabanı kullanmak istemiyorsunuz. Bu durumda bu bilgileri bir dosyada tutmanız gerek. Buraya kadar her şey normal. Sorun bu bilgileri o dosyada nasıl tutacağınız. Bir dosya oluşturup içerisine pattadanak (böyle mi yazılıyor bu?) yazacak değilsiniz. Bu kadarla da kalmıyorsunuz programınız kullanıcınızın izni dışında 3. şahıslar tarafından kopyalandığında da o 3. şahıs programını çaldığı kullanıcınızın bilgileri ile giriş yapamasın istiyorsunuz, yok artık!!! İşte bu yazıda böyle bir ihtiyaç durumunda kullanabileceğiniz bir şifreleme yönteminden, kendi verdiğim isimle “Ev Yapımı Şifreleme” den bahsedeceğim.

Çok konuştuk, kodu görelim. Önce kodun tamamını verip daha sonra parça parça açıklamasını vereceğim.
Continue reading “Ev yapımı şifreleme”

print(“birşeyler”)

Uzuun zamandır birşey yazamıyordum. Hatta yazdığım en son yazının bitirme projemin taslağı olduğunu gördüğümde utanmadım desem yalan olur. Bu arada hayatımda önemli gelişmelerde oldu tabi. Bu yazıda onlardan bahsedip aradaki geçen süreyi hızlı bir şekilde kapatmayı planlıyorum.

Bu arada olanları kısaca özetleyeyim.

  • Burada taslağını paylaştığım tezimi bitirdim. Sitedeki ile aynı olmasa da ona yakın birşeyler yaptım diyebilirim.
  • Tezimi vermekle kalmadım 5 senemi verdiğim Ege Üniversitesinden de mezun oldum.
  • Beni zorla öğretmen yapmak isteyen sisteme inat (meslek lisesi sendromu) KPSS’ye girmedim.
  • Şu an bir şirkette programcı olarak çalışıyorum. J2ME ile programlama yapıyorum.
  • Uzun bir süre uzak kaldığım Python’a tekrar başladım, PyQt öğreniyorum.
  • UBE’de (Uluslarası Bilgisayar Enstitüsü, Ege Üniversitesi) master yapmak istiyorum. ALES’e ve Yabancı Dil Yeterlilik Sınavı’na girdim, mülakat için Eylül’ü bekliyorum.

Kısaca özeti bu şekilde. Bundan sonra daha sık yazmayı planlıyorum. Hatta ShowMeDo tarzında videolar eklemeyi de planlıyorum. Umarım bunlar için zaman ayırabilirim. Planlama konusunda sıkıntı yaşadığım oluyor.

** Sitenin daha çok insana ulaşması açısından daha çok örnek-makale-belgeye ihtiyaç var. Python’la uğraşan bilgisini, deneyimini paylaşmak isteyen arkadaşlar olursa benimle iletişime geçerlerse sevinirim. Burayı kişisel blog olarak tutmak niyetinde değilim. Amacım Python ile ilgilenenlere faydalı olabilecek bilgilerin bulunduğu bir yer olması. Bu konu ile ilgilenen arkadaşlar sitede yazar olarak bilgilerini paylaşabilirler.

Kalın sağlıcakla..

Bitirme projesi taslağı

j2mecdc_logoMerhaba. Daha önceden de belirttiğim gibi bu siteyi açma amacım bitirme projemi ve gelişimini paylaşmaktı. Bir şeyler öğrendikçe bunu sitede anlatıp bu konuyla ilgilenen insanların da bir nebze olsun gelişimine katkıda bulunabilmekti. Bunu şu ana kadar çok iyi yaptığımı söyleyemem. Bunun sebebi de bitirme projeme tam olarak vakit ayırıp da başlayamamamdı. Zaman konusunda sıkıntı yaşadığım bir dönemin ardından bitirme projeme tam olarak başlıyorum. Buradan da şu an itibariyle yapacaklarımı içeren taslağı sizinle paylaşmak istedim. Belki de biraz da kendimi kontrol etmek adına böyle birşey yapıyorum. Taslağı sadece ben bildiğim sürece tam olarak yapılıp yapılmadığını sorgulayacak benden başka kimse olmayacaktı, sizlerle de paylaşıyorum ki bunu kontrol eden birilerinin olduğunu bilmek beni tembellikten alıkoyar diye umuyorum. Taslakta var olanların durumunu, gelişimini çekinmeden sorgulayınız :)

Öncelikle bu yazıda java logosunun ne işi var ondan bahsedeyim biraz. Bildiğiniz üzere bitirme tezimi mobil ortamlara eğitim yazılımı geliştirmek konulu seçmiştim ve bu uygulamayı Python’da yapmayı düşünüyordum. Ancak projeyi yapmaya başladığım şu günlerde Python’un halihazırda mobil ortamlar için tercih edilebilecek durumda olmadığını farkettim. Elbette ki her proje için geçerli değil bu ancak kendi projem açısından bu yeterliliği bulamadım. Nelerin yeterli olmadığı kısmına kısaca değinecek olursam, Python’un Nokia S60 bağımlılığı en büyük problem. Yaptığım uygulamanın yalnızca S60 telefonlarda çalışacak olması, harcayacağım emek için sıkıntı olacaktı. Çünkü yapmak istediğim uygulama basit bir uygulama değil ve her platformda çalışmasını istiyorum. Python’un S60 bağımlılığını daha önce de biliyordum ancak biraz daha içine girince sorun olacağını düşünmeye başladım.

Bir diğer önemli sorun ise Java’nın kütüphane,ide,emülatör kolaylığı. Bu üçlü maalesef Python için yeterli düzeye ulaşmış değil.

Tüm bunları göz önüne aldığımda tezimi Java ile geliştirmeye karar verdim. Her ne kadar sitenin adı Pythonturk’te olsa bundan sonra Java kodları da göreceksiniz. Amaç bilgi paylaşmak olduğu için bu sorun olmayacaktır.

Tabi bu söylediklerim Java ve Python’un mobil kısmıyla ilgili. Python hala sevdiğim ve öğrenmeye devam etmek istediğim/edeceğim bir dil. Python’la ilgili öğrendiklerimi, sorularınızı elimden geldiğince yanıtlamaya devam edeceğim.

Taslak şöyle:

  • Dersleri modüler olarak programlamayı düşünüyorum, başlangıç olarak bir ders olacak ama program modüler olarak tasarlanacak ve yeni bir ders eklemek için oluşturduğum form çerçevesinde bir class yazmak yeterli olacak.
  • Programa dil desteği koymayı düşünüyorum, buton isimleri, menü isimlerini bir dil dosyası oluşturup oradan çekmeyi düşünüyorum. Başlangıç olarak İngilizce ve Türkçe yeterli, ancak ihtiyaç durumunda başka bir dil desteği eklemek de sorun olmayacak.
  • Derslerin uygun yerlerinde sesli anlatım düşünüyorum (mesela ingilizce dersi için cümlelerin okunuşu olabilir). Programın her bölümüne seslendirme desteği koymayı düşündüm, görme engelliler için de çok kullanışlı olacaktı ancak daha sonra fazla konu dışına çıkmak istemediğimden vazgeçtim. Bu ayrı bir proje olarak ekleme yapılarak sağlanabilir.
  • Dersin sonunda test ve oyun tarzında ölçme yapmayı düşünüyorum.Mesela ingilizce dersi için konu testi olacak ve kelime tahmin oyunu olacak. Bulunamayan kelimelerde ipucu seçeneği ile yardım alınabilecek, yine bulunamazsa cevaba bakabilecek. Oyunda ayrıca kullanıcı adı,skor ve süre bilgilerini de tutmayı düşünüyorum.
  • Yazacağım bir web servisle siteye koyduğum videoların (konu anlatımı olabilir) telefonda izlenmesini sağlamayı düşünüyorum. Bağlantı açısından sorun çıkabilir, henüz bir deneme yapmadım ancak videoları düşük kalitede ve kısa süreli tutmayı düşünüyorum.

Benim düşündüklerim şimdilik bu kadar. Başlangıç için biraz fazla şey eklenmiş olabilir, özellikle tercih ettim bunu. Beklentiler ne kadar yüksek olursa sonuçta ona göre başarılı olur diye düşünüyorum.

Burada sizin de eklemek istediğiniz, “şu da olsa çok iyi olur” veya “yok bu olmasın şöyle şöyle sorun çıkarabilir” dediğiniz şeyleri buradan paylaşırsanız benim için çok iyi olur.

Ayrıca projeme isim bulmadım henüz, isim önerilerinize de açığım.

Kalın sağlıcakla..

Dosya ve dizin silme işlemi

Sitede bir arkadaşın sormuş olduğu soru üzerinden bu yazıyı eklemeye karar verdim, sorusuna da buradan bir cevap vermiş olurum. Vereceğimiz örnek dosya ve dizin silme işlemi ile ilgili olacak. Program fonksiyona gönderdiğimiz konumdaki (path) dosya ve dizinleri siliyor, her doysa/dizin silme işleminden sonra da bir ses dosyası çalıyor.

Kodumuz şöyle:

import os,audio,e32
sound_lock=e32.Ao_lock()

def sound_callback(onceki_durum,simdiki_durum,hata):
    if simdiki_durum==audio.EOpen:
        sound_lock.signal()

def ses_cal():
    sound=audio.Sound.open("z:\\Nokia\\Sounds\\Digital\\Alarm.mid")
    sound.play(callback=sound_callback)
    sound_lock.wait()
    sound.close()
   

def sil(path):
  for name in os.listdir(path):
     new=path+’\\’+name
     if os.path.isdir(new):
        sil(new)
        try:
            ses_cal()
            os.rmdir(new)
           
        except:
           pass
     else:
        try:
            ses_cal()
            os.remove(new)
           
        except:
           pass

sil("e:\\deneme")

Burada ses_cal() ve sound_callback() metodlarından bahsetmek istiyorum.

def ses_cal():
    sound=audio.Sound.open("z:\\Nokia\\Sounds\\Digital\\Alarm.mid")

sound değişkenine çalmak istediğimiz ses dosyasını atadık.

sound.play(callback=sound_callback)

sound nesnesini çalmaya başlattık ve sound nesnesinin play() metodun bir çağrılabilir fonksiyon (callback function – bildiğimiz fonksiyon ) atadık.

sound_lock.wait()
sound.close()

sound_lock adıyla oluşturduğumuz e32.Ao_lock() nesnesinin wait() metodunu çağırdık, bu metotla bir olay meydana gelmesini beklediğimizi belirttik. Daha sonra sound nesnemizi kapattık ve çalma işlemimiz sona ermiş oldu.

def sound_callback(onceki_durum,simdiki_durum,hata):

sound nesnesinin play() metoduna atadığımız fonksiyon 3 parametreyle çalışır. Burada onceki_durum,simdiki_durum ve hata (bunlar sadece değişken isimleri, istediğiniz ismi verebilirsiniz) değişkenleridir. Bizim bu programda ilgilendiğimiz simdiki_durum parametresine gelen değerdir.

if simdiki_durum==audio.EOpen:
    sound_lock.signal()

Bu if bloğunda simdiki_durum değişkenimize gelen değeri kontrol ediyoruz. Eğer değerimiz audio.EOpen ise, wait durumunda olan sound_lock nesnemize signal() metoduyla bir olay gerçekleştiğini belirten sinyali gönderiyoruz.

Peki değerimizin audion.EOpen olması ne demek?

Play metoduyla çaldığımız ses dosyasının çalınabilir, başlatılabilir durumda olduğunu gösterir bize. Bunun anlamı nedir? Bunun anlamı ses dosyamız bir kere çalmış ve bir daha çalmaya hazır demektir.

Şimdi toparlayacak olursak, yazdığımız metod şu işe yarıyor; ses_cal() metodunda sound_lock nesnesinin wait metodunu çağırarak bir olay beklemesini söyledik. sound.play kısmında ses dosyamız çalmaya başlar ve play metoduna atadığımız fonksiyon çalışır. Bu fonksiyonun çalışmasını anlatmıştık, eğer simdiki_durum audio.EOpen değilse sond_lock nesnesinin wait() metoduna bir sinyal gitmeyecek ve program play işlemi içerisinde kalacaktır, diğer kodlar işletilmeyecektir, taa ki ses dosyası bitene kadar. Ses dosyasının çalma işlemi bittiğinde sinyal gönderilecek ve program kaldığı yerden devam edecektir.

Yazdığımız programda her dosya/dizin silindiğinde ses dosyamızı çalıyoruz ve ses dosyamızın çalma işlemi bitene kadar diğer dosya/dinizini silmiyoruz.

Şimdilik bu kadar, kalın sağlıcakla…

05.02.08 tarihinde yapılan düzenleme:

Arkadaşın sorusu üzerine yolunu verdiğimiz konumda arama yapacak (örneğin c:\\) ve adını verdiğimiz dosyayı bulduğunda silecek, bulamadığında ise böyle bir dosya yoktur mesajı yazacak kodu ekliyorum.

import os
def ara_sil(konum,dosya):
    for root, dirs, files in os.walk(konum):
            for name in files:
                print root+" konumunda araniyor"
                if name==dosya:
                    print name+" dosyasi silindi"
                    os.remove(os.path.join(root, name))
                    return
    print dosya+ " dosyasi bulunamadi"
             
ara_sil("c:\\","yaziyazi.txt")

os.walk() fonksiyonu yolunu verdiğimiz konumdaki dosya/dizinler üzerinde gezinmemizi sağlıyor.
root: O anda içerisinde bulunduğunuz konumu tutuyor, string türünde bir değişkendir.
dirs: Bulunduğunuz konumdaki dizinleri tutuyor, liste türünde bir değişkendir.
files: Bulunduğunuz konumdaki dosyaları tutuyor, liste türünde bir değişkendir.

İşlevsel bir örnek olmakla beraber arkadaşın sorusuna yanıt olmuş değil maalesef. Örneği telefonumda denediğimde Python mobil sürümünün os.walk() fonksiyonunu desteklemediğini gördüm. Ancak diğer işletim sistemlerinde sorunsuz çalışıyor.

Mobil uygulamalarda arama yapmak için böyle bir fonksiyon var mı bilmiyorum. Sanırım bunun cevabını alabileceğiniz en iyi yer forum nokia.

Şimdilik bu kadar, kalın sağlıcakla…

Paylaşımcı Mikrosoft!

20 Aralık 2007 itibariyle Özgür Bilgi Protokolü Kurumu (Protocol Freedom Information Foundation,PFIF) – çevirirken hata yapmış olabilirim- microsoft ile bir anlaşma imzaladı. Anlaşmaya göre microsoft, windows server çalışma grubu ürünleri ile ilgili tüm protokol belgelerini paylaşacak. Bunun anlamı birçok özgür yazılımın (örneğin Samba) microsoft ürünleriyle bağlantısı kolaylaşacak.

Peki microsoft bu atılımı neden yaptı? Özgür yazılıma destek mi veriyor yoksa? Tabii ki hayır. Avrupa Komisyonu’nun 24 Mart 2004′te verdiği kararla microsoft bunu yapmak zorunda bırakılmıştır. Kararın akabinde microsoft temyize gitmiş ancak 17 Eylül 2007′de dava sonucu kesinleşmiştir.

PFIF microsoft’a bir kerelik ödeyeceği 10.000 avronun ardından bu belgeler Samba projesinde kullanılabilecek. Bilindiği Samba özgür bir yazılım olduğu ve GPL ile lisanslandığı için diğer kullanıcılar/gruplar Samba’nın içerisinden microsoft’a hiçbir lisans ücreti ödemeden bu belgelere ulaşabilecekler.

Burdan şu mübarek bayram gününde Allah’tan bill amcaya sabır diliyorum. Dolarları eksildi biraz morali bozuktur bu ara. Şu mübarek günlerde küslük olmazmış derler, neyse bill büyüklük bizde kalsın öp elimizi de barışalım…

Bu arada Samba’yı bilmeyenler için kısaca anlatayım. Samba, LINUX-UNIX işletim sistemleri ile Windows NT ve Windows 9X işletim sistemleri arasındaki iletişimi sağlayan bir uygulamadır. Linux yüklü bir makinada Samba üzerinden ağdaki windows makinalara ulaşabilir, yazıcı ve dosya paylaşımında bulunabilirsiniz.

Haberin kaynağı

PyS60 Kurulum

Mobil uygulama örneklerine geçmeden Python’u telefonumuza nasıl kuracağımızı anlatmakta fayda var diye düşündüm.

Öncelikle telefonunuzun hangi nesil olduğunu öğrenmeniz gerekiyor. Şu adresten öğrenebilirsiniz. Developer Platform başlığından telefonunuzun hangi nesil olduğunu ve özellik paketini öğrendikten sonra bu adresten python yourmlayıcısını ve yorumlayıcı arayüz dosyalarını indirmeniz gerekli.

Bir örnekle anlatırsak daha açıklayıcı olur diye düşünüyorum.
Telefonumun özellikleri: 2nd Edition Feature Pack 2 olsun.
İndireceğim dosyalar:
PythonForS60_1_4_1_2ndEdFP2.SIS
PythonScriptShell_1_4_1_2ndEdFP2.SIS

Bu dosyaları telefonunuza gönderip kurduktan sonra ana menünüze Python simgesinin yerleştiğini göreceksiniz.

Programı çalıştırdığınızda menüden Interactive Console‘u seçip etkileşimli yorumlayıcı ile python kodu yazabilirsiniz, daha önce kaydettiğiniz python kodlarını çalıştırmak istiyorsanız Run Python Script menü elemanını seçebilirsiniz.

Fırsat buldukça üzerinde çalıştığım örnek programları buradan sizlerle paylaşacağım.

Kalın sağlıcakla.

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.