1. Bölüm - Giris.py
Pardus-Linux.org | Wiki sitesinden
Arayüzü Oluşturalım:
Eğer daha önce Python ile ilgili bilgi edinmediyseniz
http://wiki.pardus-linux.org/index.php/Programlama:%C4%B0%C3%A7indekiler
http://www.python.quotaless.com/
ve http://www.turkpython.net
adresleri inceleyebilirsiniz. Çünkü bu anlatımlar bilgi edinmiş kimseler içindir.
Hemen işe koyulalım ve bir metin belgesi açalım. Linux altında kate, Windows altında ise Python' un kendi IDLE sini kullanmak yeterlidir..
Arayüz için Tkinter modülünü kullanıyorum, çünkü çok basit sayılabilecek bir modüldür. Şimdi küçük bir arayüz oluşturalım.
#!/usr/bin/env python
# -*- coding: cp1254 -*-
from Tkinter import *
import shelve
Giris = Tk()
Giris.geometry("350x230+350+200")
Giris.resizable(width=FALSE, height=FALSE)
Giris.title(u"TelDef - Telefon Defteri -- Sürüm 0.2")
mainloop()
Adım adım açıklayalım:
#!/usr/bin/env python # -*- coding: cp1254 -*-
Üstteki Python' un yolunu gösterir ve altındaki kodlamasını belirtir. “cp1254” Windows ortamında sorun yaşamamanızı sağlar, ama Linux altında kodlama hatası verir. Bunun için Linuxçular UTF-8 olarak değiştirmelidirler.
from Tkinter import * import shelve
Bu kısımda ise bize lazım olacak olan modülleri çekiyoruz. Tkinter bilindiği üzere Arayüz modülüdür. Bu modül her farklı platformdaki arayüzün şeklini alır. Shelve modülü ise Python da bulunan sözlüklerin benzeridir. Farkı ise belirttiğiniz anahtar ve değerini binary olarak tanımladığınız bir dosyaya kayıt eder.
Giris = Tk()
Giris.geometry("350x230+350+200")
Giris.resizable(width=FALSE, height=FALSE)
Giris.title(u"TelDef - Telefon Defteri -- Sürüm 0.2")
mainloop()
Burada ise arayüzün oluşmasını sağlıyoruz ve biraz ayar çekiyoruz :)
Tk() fonksiyonunu Giris değişkenine atıyoruz,
Giris.geometry("350x230+350+200") burada “350x230” olan kısım çerçeve boyutu olduğunu, “+350+200” ise ekranın neresinde açılacağını söylüyor.
Resizable fonksiyonuyla arayüzün tam ekran yapılabilmesini engelliyoruz. Eğer yapmassak büyütüldüğü zaman çirkin bir görüntü oluşur.
Giris.title() ile arayüzümüzün başlığını belirtiyoruz. Yazının yanındaki “u” harfini merak edenlere: Türkçe karakterlerin düzgün gözükmesi için “”(tırnak) işaretinin öncesine “unicode” anlamına gelen “u” harfi koyulur. İsterseniz “u” harfini koymadan deneyin ve Türkçe karakterlerin nasılda bozuk gözüktüğünü görün.
Sondaki mainloop() ifadesi de sürekli döngü sağlıyarak arayüzün kapanmamasını sağlıyor. Tabi ki siz “x” butonuna basana kadar :)
Arayüzü Dolduralım:
Üstteki kodlarla ancak saf, temiz bir arayüze bakabiliriz. Şimdi yavaş yavaş içini dolduralım ve şifre oluşturma gibi kodları yazmaya başlayalım.
İlk önce bize lazım olacak 2 şey var. Birisi “Label()” diğeri de “Entry()” fonksiyonudur.. Label fonksiyonu sizin belirlediğiniz bir yazıyı ekrana yazmanızı sağlar. Entry fonksiyonu ise veri girmenizi sağlayacak bir kutu oluşturur(tam adını bilemeyeceğim :) ). Hemen yukarıdaki yazdığımız kodlara aşağıdaki kodları ekleyelim.
bilgi = Label(text=u"""TelDef Uygulamasına Hoş Geldiniz! Programa İlk kez giriş yapıyorsunuz. Lütfen şifrenizi belirtiniz!""", font="DejaVuSans 8") bilgi.place(relx=0.1, rely=0.1)
İlk önce Label() fonksiyonuyla ekranımızda küçük bir “Hoş Geldin” yazısı yazdırdık ve yazı tipini DejaVu Sans olarak ayarladık ve boyutunu 8 olarak belirledik. Dikkat ederseniz Türkçe karakterler düzgün gözüksün diye “” karakterlerinden önce “u” harfini koyduk. place(relx=0.1, rely=0.1) fonksiyonu ilede yazımızın nerede konuşlandıracağımızı belirledik. “relx” matematikten hatırlayacağınız x düzleminde “rely” ise y düzleminde ne kadar kaydırma yapılacağı belirliyor. Bu kodumuzuda bilgi adlı değişkene atıyoruz.
Lsifre = Label(text=u"Şifre:", font="DejaVuSans 8")
Lsifre.place(relx=0.2, rely=0.3)
sifres = StringVar()
sifre = Entry(textvariable=sifres)
sifre.place(width=100, relx=0.4, rely=0.3)
sifre.bind("<Button-1>", uyarisil)
sifre["show"]="*"
Lsifret = Label(text=u"Şifre(t):", font="DejaVuSana 8")
Lsifret.place(relx=0.2, rely=0.4)
sifret = Entry()
sifret.place(width=100, relx=0.4, rely=0.4)
sifret.bind("<Button-1>", uyarisil)
sifret["show"]="*"
onayv = StringVar()
onay = Checkbutton(text="Onayla", variable=onayv)
onay.place(width=100, relx=0.3, rely=0.5)
giris = Button(text=u"Oluştur", command=IlkGiris, font="DejaVuSans 8")
giris.place(width=60, relx=0.1, rely=0.8)
cikis = Button(text=u"Çıkış", command=Giris.quit, font="DejaVuSans 8")
cikis.place(x=20, width=60, relx=0.7, rely=0.8)
Bu kodları inceleyecek olursak eğer şifre girmek için gerekli kodların yazılı olduğunu görüyoruz. Yabancı gelen birkaç kod parçasını da açıklayalım:
sifres = StringVar() sifre = Entry(textvariable=sifres)
sifres değişkenini string bir ifade olarak atadık ve sifre değişkenine girilecek olan verinin de string bir ifade olmasını sağladık.
sifre.bind("<Button-1>", uyarisil)
sifre["show"]="*"
bind() fonksiyonun içeriğine bakarsak sifre değişkenine tıklandığı zaman uyarisil diye bir fonksiyonu çalıştırmasını sağladığını görüyoruz(bunları daha sonra inceleyeceğiz). Sifre[“show”] = “*” ise yazılan verinin *(yıldız) olarak görünmesini sağlıyor.
Evet arayüzümüzün dış kabuğunu yaptık. Şimdi içini dolduralım. Yani şifre uyuşmazlığında uyarı verdirelim, şifre aynı ise kayıt yapalım vs. gibi. Direk olarak kodları veriyorum ve ona göre anlatacağım:
def IlkGiris():
sifreg = sifre.get()
sifretg = sifret.get()
onayg = onayv.get()
if sifreg == sifretg and onayg == "1":
if sifreg != "" and sifretg != "":
uyarikaldir()
Sifre = shelve.open("shelve.td")
Sifre[sifreg] = sifretg
Sifre.close()
dogru.place(relx=0.2, rely=0.6)
dogru["text"] = u"Tebrikler..."
Giris.quit()
if sifreg == sifretg and onayg != "1":
uyarikaldir()
uyario.place(relx=0.2, rely=0.6)
uyario["text"] = u"Onay Kutusu Boş! Lütfen Giriş Yaparken Onaylayınız..."
if sifreg != sifretg and onayg == "1":
uyarikaldir()
uyaris.place(relx=0.2, rely=0.6)
uyaris["text"] = u"Şifreler Birbiriyle Uyuşmuyor! Lütfen Tekrar Deneyin..."
if sifreg != sifretg and onayg != "1":
uyarikaldir()
uyaris.place(relx=0.2, rely=0.6)
uyario.place(relx=0.2, rely=0.7)
uyaris["text"] = u"Şifreler Birbiriyle Uyuşmuyor! Lütfen Tekrar Deneyin..."
uyario["text"] = u"Onay Kutusu Boş! Lütfen Giriş Yaparken Onaylayınız..."
if sifreg == "" or sifretg == "" and onayg != "1":
uyarikaldir()
bos.place(relx=0.3, rely=0.6)
uyario.place(relx=0.2, rely=0.7)
bos["text"] = u"Şifreyi Boş bırakamassınız!"
uyario["text"] = u"Onay Kutusu Boş! Lütfen Giriş Yaparken Onaylayınız..."
if sifreg == "" or sifretg == "" and onayg == "1":
uyarikaldir()
bos.place(relx=0.3, rely=0.6)
bos["text"] = u"Şifreyi Boş bırakamassınız!"
Önceden verdiğim kodlardan eğer giris değişkenini incelerseniz command=IlkGiris diye bir ifade vardı. Bu ifade butona bastığınızda IlkGiris fonksiyonunu işleme alıyor. Siz bir şeyler yazdığınızda(yazmadığınızda da) veri kontrolü yapan bir fonksiyonu işleme almış oluyorsunuz. Şimdi yukardaki fonksiyonu kısaca inceliyelim(Teknik ayrıntıya girmeden).
sifreg = sifre.get() sifretg = sifret.get() onayg = onayv.get()
Burada sifre, sifret, ve onayv değişkenlerinin içeriğini çekiyoruz. Bu sayede içerikler hakkında işlem yaptırıyoruz.
if sifreg == sifretg and onayg == "1":
if sifreg != "" and sifretg != "":
uyarikaldir()
Sifre = shelve.open("shelve.td")
Sifre[sifreg] = sifretg
Sifre.close()
dogru.place(relx=0.2, rely=0.6)
dogru["text"] = u"Tebrikler..."
Giris.quit()
Yukarda, her 2 kutu içerisindeki veri birbirine eşit ise ve onay kutusu onaylanmışsa alttaki komutları uyguluyor. Dikkat ederseniz bu işlemi gerçekleştirmesi için 2. satırda yazan kontrolüde geçmesi gerekecek. Eğer kutular boş değil ise devam edecek eğer boş ise hata verecek. Eğer bu komut çalışırsa dosyanın olduğu dizinde shelve.td adlı dosya oluşacak ve ilk kutu anahtar olarak ikinci kutu değeri olarak dosyaya yazdırılacaktır ve dosya kapanacaktır. Ayrıca “Tebrikler” mesajı verdikten sonra arayüz kapanacaktır.
if sifreg == sifretg and onayg != "1":
uyarikaldir()
uyario.place(relx=0.2, rely=0.6)
uyario["text"] = u"Onay Kutusu Boş! Lütfen Giriş Yaparken Onaylayınız..."
if sifreg != sifretg and onayg == "1":
uyarikaldir()
uyaris.place(relx=0.2, rely=0.6)
uyaris["text"] = u"Şifreler Birbiriyle Uyuşmuyor! Lütfen Tekrar Deneyin..."
ilk if deyiminde şifreler eşit, ama onay kutusu boş ise hata mesajını vermesini sağladık. 2. if deyiminde ise şifrler eşit değil, ama onay kutusu işaretlenmiş ise Şifre uyuşmuyor hatası verdirdik.
if sifreg != sifretg and onayg != "1":
uyarikaldir()
uyaris.place(relx=0.2, rely=0.6)
uyario.place(relx=0.2, rely=0.7)
uyaris["text"] = u"Şifreler Birbiriyle Uyuşmuyor! Lütfen Tekrar Deneyin..."
uyario["text"] = u"Onay Kutusu Boş! Lütfen Giriş Yaparken Onaylayınız..."
buradada yukardaki her 2 if deyimi de gerçekleşirse verilecek hatayı yazdırıyoruz.
if sifreg == "" or sifretg == "" and onayg != "1":
uyarikaldir()
bos.place(relx=0.3, rely=0.6)
uyario.place(relx=0.2, rely=0.7)
bos["text"] = u"Şifreyi Boş bırakamassınız!"
uyario["text"] = u"Onay Kutusu Boş! Lütfen Giriş Yaparken Onaylayınız..."
if sifreg == "" or sifretg == "" and onayg == "1":
uyarikaldir()
bos.place(relx=0.3, rely=0.6)
bos["text"] = u"Şifreyi Boş bırakamassınız!"
Bu 2 if deyiminde ise şifre kısmı boş ve onay kutusunun boş olup olmamasında verilecek hataları ayarlıyoruz.
Böylece IlkGiris() fonksiyonunu anlatmış olduk. Şimdi diğer fonksiyonları inceliyelim.
def uyarikaldir():
dogru.place_forget()
uyario.place_forget()
uyaris.place_forget()
bos.place_forget()
def uyarisil(event):
uyarikaldir()
uyarikaldir() fonksiyonu verilen hataları sildirmeye yarar. place_forget() fonksiyonu bu işe yarıyor. Bu fonksiyonuda uyarisil() fonksiyonuna ekledik. Yani uyarisil() fonksiyonu çalıştığında uyarikaldir() fonksiyonunu çalıştırmış olacak. Burada dikkatinizi çekecek olan (event) ise bir butona bind() fonksiyonuyla fazladan bir fonksiyon çalıştırmamızı sağlıyor. Eğer dikkat ederseniz Entry() fonksiyonuna bind() fonksiyonu ile uyarisil() fonksiyonunu çalıştırmış oluyoruz. Ekrandaki kutucuğa tıkladığınızda hataların silindiğini göreceksiniz.
Programımız tam olarak bitmedi hatta bu kodları ilgili yerler koysanız da bir çeşit hata verecektir. Şimdi ne eksikmiş ona bakalım;
["text"] >> Eğer IlkGiris() fonksiyonunu incelerseniz bazı değişkenlerden sonra bu ifadenin geldiğini görürsünüz. Siz eğer bir değişkene direk böyle yazıp geçerseniz hata alırsınız. Yukarıda olmayan şu kodlar hatayı ortadan kaldıracaktır.
bos = Label(text=u"", font="DejaVuSans 8") uyario = Label(text=u"", font="DejaVuSans 8") uyaris = Label(text=u"", font="DejaVuSans 8") dogru = Label(text=u"", font="DejaVuSans 8")
Gördüğünüz gibi değişkenleri atadığımız değer ile istediğimiz yerde değişken[“text”] ifadesini kullanarak işlem yapabiliriz. Tabi ki bu her araç için geçerli değil… Kodlarımızın son hali şöyle olmalı:
#!/usr/bin/env python
# -*- coding: cp1254 -*-
from Tkinter import *
import shelve
def uyarikaldir():
dogru.place_forget()
uyario.place_forget()
uyaris.place_forget()
bos.place_forget()
def uyarisil(event):
uyarikaldir()
def IlkGiris():
sifreg = sifre.get()
sifretg = sifret.get()
onayg = onayv.get()
if sifreg == sifretg and onayg == "1":
if sifreg != "" and sifretg != "":
uyarikaldir()
Sifre = shelve.open("shelve.td")
Sifre[sifreg] = sifretg
Sifre.close()
dogru.place(relx=0.2, rely=0.6)
dogru["text"] = u"Tebrikler..."
Giris.quit()
if sifreg == sifretg and onayg != "1":
uyarikaldir()
uyario.place(relx=0.2, rely=0.6)
uyario["text"] = u"Onay Kutusu Boş! Lütfen Giriş Yaparken Onaylayınız..."
if sifreg != sifretg and onayg == "1":
uyarikaldir()
uyaris.place(relx=0.2, rely=0.6)
uyaris["text"] = u"Şifreler Birbiriyle Uyuşmuyor! Lütfen Tekrar Deneyin..."
if sifreg != sifretg and onayg != "1":
uyarikaldir()
uyaris.place(relx=0.2, rely=0.6)
uyario.place(relx=0.2, rely=0.7)
uyaris["text"] = u"Şifreler Birbiriyle Uyuşmuyor! Lütfen Tekrar Deneyin..."
uyario["text"] = u"Onay Kutusu Boş! Lütfen Giriş Yaparken Onaylayınız..."
if sifreg == "" or sifretg == "" and onayg != "1":
uyarikaldir()
bos.place(relx=0.3, rely=0.6)
uyario.place(relx=0.2, rely=0.7)
bos["text"] = u"Şifreyi Boş bırakamassınız!"
uyario["text"] = u"Onay Kutusu Boş! Lütfen Giriş Yaparken Onaylayınız..."
if sifreg == "" or sifretg == "" and onayg == "1":
uyarikaldir()
bos.place(relx=0.3, rely=0.6)
bos["text"] = u"Şifreyi Boş bırakamassınız!"
Giris = Tk()
Giris.geometry("350x230+350+200")
Giris.resizable(width=FALSE, height=FALSE)
Giris.title(u"TelDef - Telefon Defteri -- Sürüm 0.2")
resim = ImageTk.PhotoImage(file="dial.gif")
Giris.tk.call('wm', 'iconphoto', Giris._w, resim)
bilgi = Label(text=u"""TelDef Uygulamasına Hoş Geldiniz!
Programa İlk kez giriş yapıyorsunuz. Lütfen şifrenizi belirtiniz!""", font="DejaVuSans 8")
bilgi.place(relx=0.1, rely=0.1)
bos = Label(text=u"", font="DejaVuSans 8")
uyario = Label(text=u"", font="DejaVuSans 8")
uyaris = Label(text=u"", font="DejaVuSans 8")
dogru = Label(text=u"", font="DejaVuSans 8")
Lsifre = Label(text=u"Şifre:", font="DejaVuSans 8")
Lsifre.place(relx=0.2, rely=0.3)
sifres = StringVar()
sifre = Entry(textvariable=sifres)
sifre.place(width=100, relx=0.4, rely=0.3)
sifre.bind("<Button-1>", uyarisil)
sifre["show"]="*"
Lsifret = Label(text=u"Şifre(t):", font="DejaVuSana 8")
Lsifret.place(relx=0.2, rely=0.4)
sifret = Entry()
sifret.place(width=100, relx=0.4, rely=0.4)
sifret.bind("<Button-1>", uyarisil)
sifret["show"]="*"
onayv = StringVar()
onay = Checkbutton(text="Onayla", variable=onayv)
onay.place(width=100, relx=0.3, rely=0.5)
giris = Button(text=u"Oluştur", command=IlkGiris, font="DejaVuSans 8")
giris.place(width=60, relx=0.1, rely=0.8)
cikis = Button(text=u"Çıkış", command=Giris.quit, font="DejaVuSans 8")
cikis.place(x=20, width=60, relx=0.7, rely=0.8)
mainloop()
Evet Giris.py dosyasının anlatımının sonuna geldik. Eğer bu dosyayı inceliyenler varsa fazladan birkaç şey daha olduğunu göreceklerdir. Şimdilik bu konulara değinmenin gereksik olduğunu düşünüyorum… Sonraki derste görüşmek üzere…
Önceki Ders: Tel-Def_e_Giriş
Sonraki Ders: 2._Bölüm_-_TelDef.py(Kişi_Ekle_Butonu)
