Python İle Tkinter Kütüphanesi Kullanarak Hesap Makinesi Nasıl Yapılır?

Python İle Tkinter Kütüphanesi Kullanarak Hesap Makinesi Nasıl Yapılır?
Python İle Tkinter Kütüphanesi Kullanarak Hesap Makinesi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce bilgisayarınızda Python'ın güncel bir sürümünün yüklü olduğundan emin olmalısınız. Tkinter, Python standart kütüphanesi ile birlikte geldiği için ekstra bir kurulum gerektirmez. Ancak, Linux tabanlı sistemlerde bazen python3-tk paketini sistem yöneticiniz üzerinden kurmanız gerekebilir.

  • Python 3.10 veya üzeri bir sürüm.
  • Bir kod düzenleyici (VS Code veya PyCharm önerilir).
  • Temel düzeyde sınıf (class) yapısı bilgisi.

Çalışma ortamınızı test etmek için aşağıdaki kodu bir Python dosyasına kaydedip çalıştırın. Eğer boş bir pencere açılıyorsa, kurulumunuz başarıyla tamamlanmış demektir.

import tkinter as tk

root = tk.Tk()
root.title("Test Penceresi")
root.geometry("200x100")
root.mainloop()

Bu kod bloğu, Tkinter kütüphanesini içe aktarır, ana pencereyi (root) oluşturur ve mainloop() metodu ile uygulamanın sürekli çalışmasını sağlar.

Adım 1: Uygulama İskeletini Oluşturma

Hesap makinemizin temelini bir sınıf yapısı üzerine kuracağız. Nesne Yönelimli Programlama (OOP), kodun sürdürülebilirliği ve yönetilebilirliği için kritik öneme sahiptir. Pencereyi, giriş kutusunu (Entry) ve butonları bu sınıf içerisinde tanımlayacağız.

import tkinter as tk

class HesapMakinesi:
    def __init__(self, root):
        self.root = root
        self.root.title("Modern Hesap Makinesi")
        self.root.geometry("300x400")
        
        self.ekran = tk.Entry(root, width=16, font=('Arial', 24), borderwidth=2, relief="solid")
        self.ekran.grid(row=0, column=0, columnspan=4, padx=10, pady=10)

root = tk.Tk()
uygulama = HesapMakinesi(root)
root.mainloop()

Burada Entry widget'ı, kullanıcının sayıları göreceği metin alanını temsil eder. grid yerleşim yöneticisi, arayüzü satır ve sütunlara bölerek butonları hizalamamızı kolaylaştırır.

Adım 2: Butonların Tasarımı ve Yerleşimi

Hesap makinesinin en önemli parçası butonlardır. Her rakam ve işlem operatörü için ayrı bir buton oluşturmak yerine, bir döngü kullanarak kod tekrarını önleyeceğiz. Bu yaklaşım, yazılım geliştirme prensiplerinden olan DRY (Don't Repeat Yourself) ilkesine uygundur.

butonlar = [
    '7', '8', '9', '/',
    '4', '5', '6', '*',
    '1', '2', '3', '-',
    'C', '0', '=', '+'
]

row_val = 1
col_val = 0

for buton in butonlar:
    tk.Button(root, text=buton, width=5, height=2, command=lambda b=buton: self.tiklama(b)).grid(row=row_val, column=col_val)
    col_val += 1
    if col_val > 3:
        col_val = 0
        row_val += 1

Yukarıdaki kod, butonlar listesindeki her bir öğe için bir Button nesnesi oluşturur. lambda fonksiyonu, butonun üzerine tıklandığında hangi değerin işleneceğini belirlemek için kullanılır.

Adım 3: İşlem Mantığını Geliştirme

Kullanıcı butonlara tıkladığında, tiklama fonksiyonu tetiklenir. Bu fonksiyon, giriş kutusundaki mevcut metni güncellemeli veya hesaplama işlemini gerçekleştirmelidir. Python'ın yerleşik eval() fonksiyonu matematiksel ifadeleri çözmek için çok pratiktir, ancak güvenlik açısından dikkatli kullanılmalıdır.

def tiklama(self, tus):
    if tus == '=':
        try:
            sonuc = eval(self.ekran.get())
            self.ekran.delete(0, tk.END)
            self.ekran.insert(tk.END, str(sonuc))
        except:
            self.ekran.delete(0, tk.END)
            self.ekran.insert(tk.END, "Hata")
    elif tus == 'C':
        self.ekran.delete(0, tk.END)
    else:
        self.ekran.insert(tk.END, tus)

Bu metot, '=' tuşuna basıldığında ifadeyi hesaplar, 'C' tuşuna basıldığında ekranı temizler, diğer durumlarda ise basılan karakteri ekrana ekler. try-except bloğu, kullanıcı geçersiz bir işlem (örneğin sıfıra bölme) yaptığında uygulamanın çökmesini engeller.

Adım 4: Kullanıcı Deneyimini İyileştirme

Uygulamanın görsel kalitesini artırmak için butonlara renkler ekleyebilir, yazı tiplerini değiştirebiliriz. Ayrıca, kullanıcıların klavyeden giriş yapabilmesi için bind metodunu kullanarak event (olay) yakalama ekleyebiliriz.

# Butonları renklendirme örneği
tk.Button(root, text=buton, bg="#f0f0f0", fg="black", font=('Arial', 14))

Bu eklemelerle birlikte hesap makineniz hem profesyonel görünecek hem de daha kullanıcı dostu bir yapıya bürünecektir.

Karşılaştırma: GUI Kütüphaneleri

Kütüphane Avantaj Dezavantaj
Tkinter Hafif, standart kurulum Eski görünüm
PyQt Profesyonel, çok güçlü Ağır, lisans kısıtlamaları
Kivy Mobil uyumlu Öğrenme eğrisi dik
Kritik Güvenlik Uyarısı: eval() fonksiyonu, kullanıcıdan alınan girdileri doğrudan çalıştırdığı için kötü niyetli kod enjeksiyonuna açıktır. Sadece güvenilir girdilerle veya bu örnekteki gibi kısıtlı matematiksel ifadelerle kullanın. Üretim ortamında (production) daha güvenli ayrıştırıcılar (parser) tercih edilmelidir.

Sıkça Sorulan Sorular

Tkinter dışında başka kütüphane kullanmalı mıyım?

Eğer amacınız hızlıca basit bir masaüstü uygulaması geliştirmekse, Tkinter en iyi başlangıçtır. Ancak daha modern ve estetik bir arayüz için CustomTkinter kütüphanesini inceleyebilirsiniz.

Hesap makinesine nasıl gelişmiş fonksiyonlar eklerim?

math kütüphanesini projenize dahil ederek karekök, trigonometrik fonksiyonlar veya logaritma gibi işlemleri math.sqrt() gibi metotlarla kolayca ekleyebilirsiniz.

Uygulamayı .exe dosyasına nasıl dönüştürürüm?

pyinstaller kütüphanesini kullanarak pyinstaller --onefile hesap_makinesi.py komutu ile uygulamanızı bağımsız bir çalıştırılabilir dosya haline getirebilirsiniz.

Neden butonlar birbirine yapışık görünüyor?

grid yerleşiminde padx ve pady parametrelerini kullanarak butonlar arasına boşluk bırakabilirsiniz. Bu, görsel düzeni doğrudan etkiler.

Hata mesajını nasıl daha iyi yönetebilirim?

try-except bloklarında sadece genel Exception değil, ZeroDivisionError veya SyntaxError gibi spesifik hataları yakalayarak kullanıcıya daha anlamlı mesajlar gösterebilirsiniz.

Uygulama Performansını Optimize Etme ve Bellek Yönetimi

Tkinter uygulamaları genellikle düşük kaynak tüketimiyle çalışsa da, karmaşık arayüzlerde veya sürekli güncellenen hesaplama ekranlarında performans düşüşleri yaşanabilir. Özellikle eval() fonksiyonunu yoğun döngülerde kullanmak yerine, matematiksel ifadeleri ayrıştıran (parsing) daha güvenli ve hızlı yöntemler tercih edilmelidir.

Bellek yönetimi açısından, her işlem sonrası oluşturulan geçici nesnelerin temizlendiğinden emin olunmalıdır. Eğer uygulamanızda çok sayıda buton ve widget bulunuyorsa, bunları bir liste içerisinde tutarak döngü ile oluşturmak, kodun okunabilirliğini artırırken bellek kullanımını optimize eder.

# Widget oluşturma optimizasyonu örneği
buttons = ['7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+']
row_val = 1
col_val = 0

for button in buttons:
    action = lambda x=button: self.on_button_click(x)
    tk.Button(self.master, text=button, width=5, command=action).grid(row=row_val, column=col_val)
    col_val += 1
    if col_val > 3:
        col_val = 0
        row_val += 1

Birim Testleri (Unit Testing) ile Hesaplama Doğruluğunu Sağlama

Hesap makinenizin matematiksel mantığının her zaman doğru çalıştığından emin olmak için unittest kütüphanesini kullanabilirsiniz. GUI testleri zorlayıcı olabilir; bu nedenle hesaplama mantığını arayüzden bağımsız bir fonksiyon veya sınıf içerisinde tutmak, test edilebilirliği artırır.

Aşağıdaki örnekte, hesaplama motorunuzu nasıl test edebileceğinizi görebilirsiniz:

import unittest

def calculate_expression(expression):
    # Güvenli bir şekilde hesaplama yapan fonksiyon
    try:
        return eval(expression)
    except ZeroDivisionError:
        return "Hata: Sıfıra Bölme"

class TestCalculator(unittest.TestCase):
    def test_addition(self):
        self.assertEqual(calculate_expression("2+2"), 4)
    
    def test_division_by_zero(self):
        self.assertEqual(calculate_expression("10/0"), "Hata: Sıfıra Bölme")

if __name__ == '__main__':
    unittest.main()

Bu yaklaşım, uygulamanıza yeni özellikler eklediğinizde (örneğin karekök veya üs alma fonksiyonları) mevcut işlemlerin bozulmadığından emin olmanızı sağlar. Test odaklı geliştirme (TDD) prensiplerini benimsemek, profesyonel bir yazılım geliştirme sürecinin en önemli parçasıdır.

Sonuç

Python ile Tkinter kullanarak bir hesap makinesi tasarlamak, yazılım geliştirme sürecinin temel taşlarını anlamanıza yardımcı olur. Bu projede; sınıf yapısı, olay yönetimi, arayüz tasarımı ve hata ayıklama konularında pratik yapmış oldunuz. Bir sonraki adım olarak, bu hesap makinesine bir "geçmiş" (history) özelliği ekleyerek yapılan son 5 işlemi bir liste kutusunda (Listbox) göstermeyi deneyebilirsiniz.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Ticari yazılımlarınızda kullanmadan önce güvenlik açıklarını (özellikle veri girişi doğrulaması) gözden geçirmeniz ve gerekli testleri yapmanız tavsiye edilir.
Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Hobi projeleri ve kendin yap (DIY) içerikleri üzerine uzmanlaşmış bir içerik editörüyüm. Adım adım rehberlerle okuyucuların teknik becerilerini geliştirmelerine yardımcı oluyorum.

Yorumlar (18)

18
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Tolga B.
Tolga B. 23 Temmuz 2026

Tkinter yerine PyQt mi öğrensem yoksa bununla devam mı etsem kararsız kaldım, ne dersin?

Seda Nur
Seda Nur 24 Temmuz 2026

Bence Tkinter ile mantığı kavrayıp sonra PyQt'ye geçmek daha mantıklı, çok karmaşık gelebilir ilk etapta.

Ali Rıza
Ali Rıza 24 Temmuz 2026

Kod bloğunda küçük bir yazım hatası var sanki, 'calculator' değişkenini tanımlarken eksik olmuş ama çözdüm.

Zeynep Kaya
Zeynep Kaya 25 Temmuz 2026

Gözünden kaçmamış Ali, hemen güncelledim. Dikkatli incelediğin için teşekkür ederim!

Elifnur Şen
Elifnur Şen 26 Temmuz 2026

Denedim ve çalıştı! Çok mutluyum, ilk kez kendi masaüstü uygulamamı yaptım :)

Kaan Yılmaz
Kaan Yılmaz 28 Temmuz 2026

Yazı güzel de keşke biraz daha fazla yorum satırı ekleseydin, yeni başlayanlar için kafa karıştırıcı olabilir bazen.

Zeynep Kaya
Zeynep Kaya 29 Temmuz 2026

Eleştirin için teşekkürler Kaan. Haklısın, bir sonraki rehberimde daha detaylı yorum satırlarına yer vermeye çalışacağım.

Zeynep Vural
Zeynep Vural 30 Temmuz 2026

Merhaba, bu kodları exe dosyasına çevirmek için ne kullanmamı önerirsiniz? PyInstaller mı daha iyi?

Hakan K.
Hakan K. 30 Temmuz 2026

Ben PyInstaller kullanıyorum, oldukça stabil çalışıyor Zeynep hanım.

Burak Özdemir
Burak Özdemir 31 Temmuz 2026

Butonların renklerini değiştirmek için .config metodunu kullanmak çok pratik oldu, bunu bilmiyodum teşekkürler.

Zeynep Kaya
Zeynep Kaya 31 Temmuz 2026

Rica ederim Burak! Evet, .config metodu arayüzü kişiselleştirmek için en büyük kurtarıcımız.

Deniz Çelik
Deniz Çelik 01 Ağustos 2026

Gayet net ve anlaşılır bir yazı olmuş. Tkinter'a yeni başlayanlar için harika bir pratik.

Mert Gürsoy
Mert Gürsoy 02 Ağustos 2026

Kodları kopyaladım ama hata alıyom, kütüphane mi yüklü değil acaba? python 3.10 kullanıyorum sorun olur mu?

Zeynep Kaya
Zeynep Kaya 03 Ağustos 2026

Mert, Tkinter genelde Python ile hazır gelir ama bazı Linux dağıtımlarında ayrıca kurman gerekebilir. Aldığın hatayı paylaşırsan yardımcı olabilirim.

Selin Aras
Selin Aras 03 Ağustos 2026

Harika anlatım olmuş. Peki bu hesap makinesine bir de geçmişi görme özelliği ekleyebilir miyiz? Nasıl bir yol izlemeliyim?

Emre Berk
Emre Berk 04 Ağustos 2026

Selin, geçmiş için bir liste (listbox) kullanıp işlemleri oraya append edebilirsin, bence denemelisin.

Caner Yılmaz
Caner Yılmaz 05 Ağustos 2026

Eline sağlık Zeynep, tkinter ile uğraşırken hep arayüz kısmında takılıyodum, bu rehber ilaç gibi geldi.

Zeynep Kaya
Zeynep Kaya 06 Ağustos 2026

Çok teşekkür ederim Caner! Tkinter'ın grid yapısını çözdükten sonra arayüz tasarlamak çok daha keyifli hale geliyor.

Yorum Yaz