Home>>Python>>Python ile GUI Geliştirme | Örneklerle Tkinter
PythonTkinter

Python ile GUI Geliştirme | Örneklerle Tkinter

Bu makalemde Python Tkinter modülü ile örnek proje yapacağız. Projeyi yapmadan önce Tkinter kullanımıyla ilgili fazla detaya girmeden bir kaç örnek göstereceğim. Yazı içeriğini başlıklar halinde aşağıda paylaştım. Sırayla değinip, dilim döndüğünce kısa kısa anlatmaya çalışacağım.

İçerik;

  1. Tkinter Nedir?
  2. Tkinter ile Neler yapılır?
  3. Projeye Giriş
    3.0. Kurulum
    3.1. Pencere Oluşturma
    3.2. Label ve Fontlar
    3.3. Buton Ekleme
    3.4. Messagebox
    3.5. Entry Kullanımı
    3.6. Widget Hizalama
    3.7. Görsel Ekleme ve boyutlandırma
    3.8. Proje | Kullanıcı Giriş Ekranı

1. Tkinter Nedir?

Tkinter, Python’un GUI (Grafik Kullanıcı Arayüzü) modülüdür. Windows, MacOS ve Linux üzerinde çalışır. Sanıldığı gibi geliştirici Python değil, ActiveState’dir.

2. Tkinter ile Neler yapılır?

Tkinter kullanarak hızlı ve kolay bir şekilde istediğiniz GUI uygulamaları yazabilirsiniz. Eğer Python’da daha profesyonel bir program yazmak istiyorsanız PyQt5 modülüne bakmanız gerekecektir.

3. Projeye Giriş

3.0. Kurulum

Tkinter, Python ile beraber kurulması gerekiyor.
Aşağıdaki kodu yazarak mevcut sürümüne bakabilirsiniz;

python -m tkinter

Sisteminizde kurulu değilse şu kodu yazarak kurabilirsiniz;

pip install tk

3.1. Pencere Oluşturma

Standart olarak ilk önce modülümüzü import ediyoruz.
Modüldeki fonksiyonları kullanabilmek için Tk() fonksiyonunu bir değere atıyoruz. Ben burada ‘tk’ olarak adlandırdım, siz istediğinizi yazabilirsiniz.

Kodun en sonuna mutlaka mainloop() ‘u yazmalısınız. Aksi taktirde programınız ekrana gelmeyecektir.

Kodumuzu çalıştırdığımızda ekrana 400×250 boyutunda minik bir pencere gelecektir.

Çıktı:

3.2. Label ve Fontlar

Label() sınıfında kullanılan bazı fonksiyonları inceleyelim. Bu fonksiyonların anlamları ve kullanımı şöyledir;

  • text = Etikette yazmasını istediğimiz değer
  • font = Yazı tipi, boyutu ve biçimi
  • bg = background yani arka plan rengi
  • fg = foreground yani yazının rengi
  • bd = borderwidth yani etiketin kenar boşluklarıdır. Varsayılan olarak 2px’dir.
  • underline = Altı çizgili yazı

Örnek:

from tkinter import *

tk = Tk()
tk.title("Yazılım Furyası | Tkinter - Label")
tk.geometry("400x300")

Label(tk,text="Verdana",font="Verdana 12", bg="red", fg="white").pack()
Label(tk,text="Verdana Bold",font="Verdana 12 bold underline").pack()
Label(tk,text="Verdana italic",font="Verdana 12 italic").pack()
Label(tk,text="Verdana roman",font="Verdana 12 roman").pack()

Label(tk,text="Helvetica",font="Helvetica 12", bg="green", fg="yellow").pack()
Label(tk,text="Helvetica bold",font="Helvetica 12 bold").pack()
Label(tk,text="Helvetica italic",font="Helvetica 12 italic").pack()
Label(tk,text="Helvetica roman",font="Helvetica 12 roman").pack()

Label(tk,text="Times",font="Times 12", bg="black", fg="white").pack()
Label(tk,text="Times Bold",font="Times 12 bold").pack()
Label(tk,text="Times italic",font="Times 12 italic").pack()
Label(tk,text="Times roman",font="Times 12 roman").pack()

tk.mainloop()

Çıktı:

3.3. Buton Ekleme

Önce, Button() sınıfında kullanılan bazı fonksiyonları inceleyelim. Bu fonksiyonların anlamları ve kullanımı şöyledir;

  • padx, pady = Yatay ve dikey olarak buton boyutunu belirliyor.
  • cursor = Fare imleci
    – arrow
    – circle
    – clock
    – cross
    – dotbox
    – exchange
    – fleur
    – heart
    – hand2
    – man
    – mouse
    – pirate
    – plus
    – shuttle
    – sizing
    – spider
    – spraycan
    – star
    – target
    – tcross
    – trek
    – watch
  • command = Butona tıklandığında çağrılacak işlev veya yöntem
  • focus_set() = Butona odaklanmasını sağlar
  • state = Butonun hareketine karar vermemizi sağlar. “active, disabled” olarak iki durumu vardır. Mesela butona tıklanılmasını engellemek istiyorsak state=”disabled” yazarak yapabiliriz.
  • activeforeground = Butona tıkladığımızda yazı rengini belirliyoruz.
  • activebackground = Butona tıkladığımızda buton rengini belirliyoruz.

Kodumuzu çalıştırdığımızda ekranda aşağıdaki Çıktı görseli gibi pencere çıkacaktır. Butona tıkladığımız vakit, buton fonksiyonunu çalıştıracaktır ve label’e atadığımız değeri text’e yazacaktır.

Butona tıkladığımız zaman çalışması için command fonksiyonunu yazmamız gerekir. Command ile buton fonksiyonumuzu çağırdık.

Örnek:

from tkinter import *

tk = Tk()
tk.title("Yazılım Furyası | Tkinter - Buton Ekleme")
tk.geometry("400x250")

def buton():
    lbl["text"] = "1. Butona Tıklandı"
def buton2():
    lbl["text"] = "2. Butona tıklandı"

btn = Button(tk,
            text="Buton",
            padx="20",pady="5",
            command=buton)
btn.pack()

btn2 = Button(tk,
            text = "Buton 2", font="Times 12 bold",
            padx="25", pady="10", 
            bg="red", fg="white", cursor="hand2",
            activeforeground="green", activebackground="black",
            command=buton2)
btn2.pack()

lbl = Label(tk)
lbl.pack()

tk.mainloop()

Çıktı:

3.4. Messagebox

Messagebox’ın tüm kullanımlarını aşağıdaki kod script’in de verdim. Kodu çalıştırırsanız daha iyi anlayacaksınız.
Yine de kullanılan fonksiyonları yazayım;

Kullanıcıya, bilgihata veya uyarı mesajı vermek için aşağıdaki fonksiyonlar kullanılır.

  • showinfo
  • showerror
  • showwarning

Tekrar dene, evet-hayır gibi şartlı kutular için aşağıdaki fonksiyonlar kullanılır.

  • askyesno
  • askokcancel
  • askquestion
  • askretrycancel
  • askyesnocancel

Örnek:

from tkinter import *
from tkinter import messagebox

tk = Tk()
tk.title("Yazılım Furyası | Tkinter - Messagebox")
tk.geometry("400x250")

def show():
    messagebox.showinfo("Başlık", "İnfo")
    messagebox.showerror("Başlık","Hata")
    messagebox.showwarning("Başlık","Uyarı")

def ask():
    messagebox.askyesno("Başlık","askyesno")
    messagebox.askokcancel("Başlık","askokcancel")
    messagebox.askquestion("Başlık","askquestion")
    messagebox.askretrycancel("Başlık","askretrycancel")
    messagebox.askyesnocancel("Başlık","askyesnocancel")

L1 = Label(tk,text="MESSAGEBOX",font="Verdana 12 bold")
L1.pack()
B1 = Button(tk, text="show", command=show)
B1.pack()
B2 = Button(tk, text="ask", command=ask)
B2.pack()

tk.mainloop()

Çıktı:
Sırasıyla kutular ekrana gelecektir.

3.5. Entry Kullanımı

C# kullananlar yakından tanır textbox’ı. Ancak Tkinter’de Entry olarak kullanılır/adlandırılır.

Entry sınıfında anlatılacak detay çok aslında. Ancak şuanda fazla detaya girmeyeceğim.

Label örneklerinde gösterdiğim fonksiyonlar burada da geçerlidir. (Font, bg,fg,bd vs.)

  • width = ile genişliği belirliyoruz.
  • show = Normalde, kullanıcının yazdığı karakterler girişte gözükür. Ancak yıldızlı göstermek için, show = “*” olarak yazın. (Yıldız yerine istediğiniz karakteri yazabilirsiniz.)
  • textvariable = Geçerli metni, giriş widget’ınızdan alabilmek için, bu seçeneği StringVar sınıfının bir örneğine ayarlamanız gerekir.
  • get() = Girişin geçerli metnini bir dizge olarak döndürür. Yani ekrana yazdırabiliriz.
  • insert = Verilen dizindeki karakterden önce belirttiğimiz değerleri ekler. insert(0,”ekle”)
  • delete() = Widget’tan karakterleri siler.

Örnek:

from tkinter import *

tk = Tk()
tk.title("Yazılım Furyası | Tkinter - Entry")
tk.geometry("400x250")

lbl = Label(tk,text="Entry")
lbl.pack()

entry = Entry(tk, width=25)
entry.pack()
entry2 = Entry(tk,textvariable=StringVar(), show='*', width=25)
entry2.pack()
tk.mainloop()

Çıktı:
Ekrana bu şirin kutu gelecektir.

3.6. Widget Hizalama | grid, place

Dikkat ettiyseniz tüm Widgetlerimizi ‘pack()’ yazarak ekledik ve konumlarını kendisi belirledi. Peki biz istediğimiz konuma nasıl alırız derseniz, devreye ‘grid’ ve ‘place’ fonksiyonu giriyor.

  • pack() = Pencerenin tam ortasına üstten aşağıya doğru ekliyor Widgetleri.
  • place() = Paylaştığım örnekte de gördüğünüz gibi, x ve y koordinatlarını belirterek istediğimiz alana Widget’i koyabiliyoruz.
  • grid()
    – row = Satır
    – column = Sütun
    – pady = Dikey olarak Widgetler arası mesafe yani boşluk bırakma.
    – padx = Yatay olarak Widgetler arası mesafe yani boşluk bırakma.

Örnek:

from tkinter import *

tk = Tk()
tk.title("Yazılım Furyası | Tkinter - Hizalama")
tk.geometry("400x250")

# Grid
G1 = Label(tk, text="Grid Label 1")
G1.grid(row=0, column=0, pady=5, padx=5)
G2 = Button(tk, text="Grid Button 1")
G2.grid(row=0, column=1, pady=5, padx=5)
G3 = Label(tk, text="Grid Label 2")
G3.grid(row=1, column=0)
G4 = Button(tk, text="Grid Button 2")
G4.grid(row=1, column=1)

# Place
P1 = Label(tk, text="Place Label")
P1.place(x=170,y=140)
P2 = Button(tk, text="Place Button")
P2.place(x=165,y=165)

tk.mainloop()

Çıktı:

3.7. Görsel Ekleme

Resim işleri için Image modülünü import etmemiz gerekli. Burada benim pek anlatacak bir şeyim yok, bırakalım kodlar konuşsun;

Örnek:

from tkinter import *
from PIL import ImageTk, Image

tk = Tk()
tk.title("Yazılım Furyası | Tkinter - Resim Ekleme ve Boyutlandırma")
tk.geometry("500x500")

resim = ImageTk.PhotoImage(Image.open("Desktop/cat.png"))
Label(tk,image=resim).pack()

# Yeniden Boyutlandırma
image = Image.open("Desktop/cat.png")
# resize(width, height)
resize_image = image.resize((110,160))

img = ImageTk.PhotoImage(resize_image)
Label(tk,image=img).pack()

tk.mainloop()

Çıktı:

3.8. Final | Kullanıcı Giriş Ekranı Yapımı

Burada direkt olarak kodları verip, gerekli açıklamaları yorum satırlarında anlatmaya çalıştım.

from tkinter import *
from tkinter import messagebox
from PIL import ImageTk, Image


# Tk sınıfını 'window'a atadık.
window = Tk()

# Pencere Başlığı
window.title("Kullanıcı Giriş Ekranı")

# Pencereye ikon ekleme
window.iconbitmap("Desktop/scorp.ico")

window.geometry("390x220")

# Pencerenin yeniden boyutlandırılmasını engelledik
window.resizable(width=False, height=False)


# Resim ekledik
resim = ImageTk.PhotoImage(Image.open("Desktop/login.jpg"))
lresim = Label(window,image=resim)
lresim.place(x=250,y=10)


# Hata mesajımızı bu Label'e yazdıracaz
L3 = Label(window)
L3.place(x=148,y=200)

def giris():
    
    # E1 ve E2 adlı Entry'e girilen değeri, get() fonksiyonuyla çekip sorguluyoruz. 
    if (E1.get() == str("admin")) and (E2.get() == str("1234")):
        L3['text'] = ("Giriş Başarılı...")
        messagebox.showinfo("Başlık", "Giriş Başarılı")
        print("başarılı")
    else:
        L3['text'] = ("Hatalı Giriş !")
        messagebox.showerror("Hata Başlık", "Hatalı Giriş")

L1 = Label(window, text="Kullanıcı Adı")
L1.place(x=75, y=15)

E1 = Entry(window, width=25)
E1.place(x=77,y=45)

L2 = Label(window, text="Şifre")
L2.place(x=75, y=80)

E2 = Entry(window, textvariable=StringVar(),show='*', width=25)
E2.place(x=77, y=110)

bt = Button(window, text="Giriş Yap", padx="20",pady="5", command=giris)
bt.place(x=75,y=150)

window.mainloop()

Çıktı:

Kodlarken kullandığım sürümler;

İşletim sistemi: Win10 Pro 20H2 x64
Python: 3.8.1
Tcl/Tk: 8.6

Kodlarda karışıklık olmasın ve aklınıza daha iyi yatması için SQL bağlantısı yapmadım. Uzun kodlar göz korkutur.

Eğer Tkinter modülünü ilk defa kullanıyorsanız, korkmayın. İlk bakışta göz korkutabilir ancak küçük projeler yaparak kendinizi geliştirebilir, kısa süre içinde Tkinter de istediğiniz uygulamaları rahatça yapabilirsiniz.

Kaynak;

https://www.geeksforgeeks.org/python-gui-tkinter/
https://docs.python.org/3/library/tkinter.html
https://realpython.com/python-gui-tkinter/

Adblock Detected

Lütfen reklam engelleyicinizi devre dışı bırakarak bizi destekleyin.

Refresh Page