Thinking in Tkinter

  •  Standart bir kullanıcı arayüzü(UI) ne yapmalıdır?
  1. Kullanıcı arayüzü yazan bir programcı ilk olarak kullanıcıya neler göstereceğini belirlemelidir
  2. Kullanıcı arayüzünün hangi işlemleri yapacağını belirlemelidir.
  3. Görüntü ile yapılan işlemleri uygun bir biçimde birbiriyle eşleştirmelidir.
  4. Kullanıcı girişini gerçekleştirmeye imkan tanımalıdır.
  • Temel Kullanıcı Arayüzü Terimleri
  1. Bir kullanıcı arayüzü, arayüz oluşturmak adına programcıya "widget" adı verilen bileşenler sunar. Bu widgetler arayüzde görüntülenen şeylerdir. Bunlar, buton, pencere, menü, scrollbar vb. olabilir.
  2. Event handlers sayesinde herhangi gerçek zamanlı bir eylemden haberimiz olabilir. Örneğin kullanıcının imleci pencere üzerinde dolaştırması, klavyeye basması, fareye tıklaması gibi.
  3. Binding ise widget'ler ile event handler'ları birbirine bağlamamızı sağlar.
  4. Event loop ise programın kullanıcıdan veri girmesini beklediğimiz kısımdır.
      Basit Bir Tkinter Programı ve Açıklaması
from tkinter import *
root = Tk()
root.mainloop()
    Birinci satırda tkinter kütüphanesini kodumuza ekliyoruz. İkinci satırda root değişkenine tkinter.Tk sınıfının bir örneğini eşitliyoruz. İsterseniz type fonksiyonu ile araştırabilirsiniz. Son satırdaysa event loop oluşturuyoruz. Event loop kullanıcıdan bir destroy eventi gelinceye kadar event handlerlar aracılığıyla veri girişini kontrol eder.

       Container
    Burada widgetları nasıl kullanacağımıza karar vermeden önce containerlardan bahsetmemiz gerekiyor. Bir widgetı direkt olarak tkinter.Tk nesnesinin üzerine değil container'ın üzerine ekleriz. Bu çeşitli şekillerde arayüz oluşturma deneyimimizi geliştirir, kolaylaştırır. Her tkinter.Tk nesnesinde yeni bir pencere oluştururuz. Ancak container'lar sayesinde tek bir pencereyi ebeveyn(parent) olarak seçip söz konusu container'a widgetleri ekleyebiliriz. Birden fazla container ile tek bir pencerede çalışabiliriz.

from tkinter import *
root = Tk()
container = Frame(root)
container.pack()
root.mainloop()
    Burada Frame(bir container) nesnesi oluşturup container değişkenine atadık. Parametre olarak ebeveyn tkinter.Tk nesnesini seçtik(root). pack metodu nesnelerin arayüzde gözükmesini sağlar. Bu iki işlem - ebeveyn ile ilişkilendirme ve pack - Tkinter programlamada sıkça karşımıza çıkacak.

    Pack Hakkında Not: Aslında Tkinter'ın kendisi Tcl/Tk ile arayüz oluşturabilmek için oluşturulan bir Python API'sidir. Pack metodu da Tkinter kütüphanesi ile aramızda köprü oluşturarak widget ve containerların nasıl görüntüleneceğini belirler. Nitekim kendisi bir geometry manager'dır.

    Not: tkinter.Tk ile oluşturulan pencerenin kendisi de container içermektedir. Diğerlerinden farklı olarak cavity adı verilmiştir bu container'a. Cavity, elastik bir biçimde dizayn edilmiştir. Üzerine eklenen widget ve containerların boyutuna göre kendi boyutlarını belirler.

Python ile Sezar Şifrelemesi

alfabe = "abcçdefghıijklmnoöprsştuüvyz"
hane = int(input("Kaç hane atlansın?"))
yazi = input("Gizlemek istediğiniz yazıyı girin: ")
sira = 0
sifre1 = ""
sifre = []
def mod(sayi,hane):
    if sayi + hane > 29:
        return (29 + hane) - hane
    else:
        return sayi + hane
for i, z in enumerate(alfabe):
    sifre.append([z,mod(i,hane)])

for i in yazi:
    for s,h in sifre:
        if i == s:
            sira = h
            sifre1 += sifre[sira][0]
            
print(sifre1)

Python ile Soru Çözüm Kitabı

 

    Bu başlık altında Python ile Soru Çözüm Kitabı'nda hoşuma giden kod örneklerini paylaşmayı planlıyorum. Kitap Dr. Eftal Şehirli ve Dr. Muhammed Kamil Turan ortaklığında yazılmış. Kitabı satın almak isterseniz https://www.nobelyayin.com/kitap_16696.html adresine bakabilirsiniz. E-Kitap olarak da kiralanabiliyor.

metin = input("Metin giriniz: ")
ifade = input("Aranmak istenen ifadeyi giriniz: ")
ifadeVarMi = False
i = 0
while i <= len(metin) - len(ifade):
    if metin[i: i + len(ifade)] == ifade:
        ifadeVarMi = True
        break
    i += 1
if ifadeVarMi:
    print("İfade var.")
else:
    print("İfade yok.")

Bu basit ve harika kodda string kesme işlemleri kullanılarak while döngüsünün her adımında bir karakter ilerlenerek metindeki ifade aranıyor.

Python Rastgele Uygulamalar

 Bu başlıkta Python'da random vb modüller kullanılarak yapılabilecek uygulamaları derleyeceğim.

import random
print("""Sayı Tahmin Oyununa Hoşgeldiniz
1'den 10'a kadar bir sayı giriniz.""")
i = 0
while(i < 5):
    randSayi = random.randint(1,10)
    sayi = int(input("Sayı:"))
    if(randSayi == 1):
        pass
    elif(randSayi > sayi):
        print("Sayı:",randSayi,"Tahmin:",sayi)
        i += 1
    elif(randSayi < sayi):
        print("Sayı:",randSayi,"Tahmin:",sayi)
        break
if(i == 5):
    print("Tebrikler")
else:
    print("Kaybettiniz")
    Bu örnekte bilgisayar 1 ila 10 arası bir sayı rastgele bir sayı türeterek kullanıcıdan gelen veriyle karşılaştırıyor. Eğer girilen sayı türetilen sayıdan küçükse başarılı sayılıp döngünün bir sonraki aşamasına geçiliyor. Türetilen sayının 1'e eşit olması durumunda pass deyimi sayesinde hiçbir işlem yapılmadan geçiliyor. Girilen sayının türetilen sayıdan büyük olması halindeyse başarısız sayılıp oyun sonlanıyor.
import random
kosul = True
turetilen_sayi = [5]
tur = 0
while(kosul and tur < 5):
    print(turetilen_sayi[len(turetilen_sayi) - 1])
    secim = input("b mi k mi?")
    turetilen_sayi.append(random.randint(1,10))
    if(secim == "k"):
        kosul = turetilen_sayi[len(turetilen_sayi) - 1] < turetilen_sayi[len(turetilen_sayi) - 2]
    if(secim == "b"):
        kosul = turetilen_sayi[len(turetilen_sayi) - 1] > turetilen_sayi[len(turetilen_sayi) - 2]
    tur += 1
if(tur < 5):
    print("Kaybettiniz.")
else:
    print("Tebrikler.")
    İkinci örnekte rastgele bir sayı türetiliyor ve kullanıcıya yeni sayının eskisinden büyük olup olmayacağı soruluyor. Tüm bu veriler listeler aracılığı ile kontrol ediliyor.
import random
alfabe = "abcçdefgğhıijklmnoöprsştuüvyz"
buyuk_harfler = alfabe.upper()
sayilar = "1234567890"
ozel_karakterler = ",;-_*!+&%^."
sifre = ""
mod = 0
hane = int(input("Şifreniz kaç haneli olsun?"))
while(len(sifre) < hane):
    mod = random.randint(1,4)
    if mod == 1:
        sifre += alfabe[random.randint(0,len(alfabe)) - 1]
    if mod == 2:
        sifre += buyuk_harfler[random.randint(0,len(buyuk_harfler)) - 1]
    if mod == 3:
        sifre += sayilar[random.randint(0,len(sayilar)) - 1]
    if mod == 4:
        sifre += ozel_karakterler[random.randint(0,len(ozel_karakterler)) - 1]
print("Şifreniz:",sifre)
    Basit bir parola oluşturucu. Rastgele belirlenen 4 karakter tipi arasından rastgele bir biçimde karakter seçiyor ve bunu sifre değişkenine aktarıyor. Kullanıcının girdiği karakter sayısına ulaşıncaya dek işlem devam ediyor.
import random
sayi = str(random.randint(1000,9999))
print(sayi)
dizi = []
for i in range(0,10):
    if str(i) in sayi:
        dizi.append(i)
if len(dizi) < 4:
    print("rakamlar birbirinden farklı değil.")
else:
    print("rakamlar birbirinden farklı.")
    Şimdiyse bilgisayar tarafından rastgele oluşturulan bir sayının rakamlarının farklı olup olmadığını kontrol ettik. Bu işlemi 4 haneli sayılar için tasarladık(sebebini bir sonraki örnekte göreceksiniz). 4 haneli rakamları farklı bir sayıyı oluşturan rakamların kümesinin eleman sayısı 4 olmak zorunda olacağından range fonksiyonu ile 0'dan 9'a kadar olan tüm rakamların oluşturulan sayıda yer alıp almadığını kontrol ettik. Eğer sayı yer alıyorsa dizimize ekledik ve son olarak dizinin eleman sayısını len fonksiyonu ile kontrol ettik.
import random
rastgele_sayi = str(random.randint(1000,9999))
dizi = []
tahmin_sayisi = 1
cikti = ""
tahmin = input("Tahmininizi giriniz: ")
while(len(dizi) < 4):
    for i in range(0,10):
        if str(i) in rastgele_sayi:
            dizi.append(i)
while(rastgele_sayi != tahmin):
    cikti = ""
    for i,n in enumerate(rastgele_sayi):
        for z,x in enumerate(tahmin):
            if x == n and z == i:
                cikti += "+"
            if x == n and z != i:
                cikti += "-"
    print(tahmin_sayisi,".tahmininizde çıkan sonuç:",cikti," Tahmininiz:",tahmin)
    tahmin_sayisi += 1
    tahmin = input("Tahmininizi giriniz: ")
print("Tebrikler, doğru tahmin!")
    Burada bilinen bir sayı tahmin oyununun Python uyarlamasını yaptık. Oyundaki amacınız her rakamı farklı olan 4 haneli bir sayıyı size verilen ipuçlarından yararlanarak bulmaktır. + doğru rakamın doğru yerde bulunduğu anlamına gelir. - rakamı ise doğru rakamın yanlış yerde olduğu anlamına, bu ipuçlarından yararlanarak doğru sayıyı en az denemede bulmaya çalışırsınız. Rakamları farklı 4 haneli bir sayı oluşturabilmek için daha önceki örneğimizdeki kodu kullandık. Sayıları karşılaştırmak içinse öncelikle enumerate metodunu kullanarak her rakamı basamaklarıyla eşleştirdik ve for döngüsü kullanarak konumlarını kıyasladık. Eğer rakam ve bulunduğu konum birbirine eşitse cikti değişkenine + ekledik ancak rakam eşit konum farklıysa çıktı değişkenine - ekledik. Böylece kullanıcıya ipucunu sunmuş olduk.