Merhaba, kodunuz üzerinde düzeltme yapmayacağım, fakat size fikir vermek açısından;
örneğine bakabilirsiniz.
Arayüz tasarımı ve event driven control mantığını kavramanız gerekir.
Yine chatgpt ye rica ettim örnek bir bilimsel hesap makinesi kodu yazdı:
import tkinter as tk
import math
class ScientificCalculator:
def __init__(self, root):
self.root = root
self.root.title("Bilimsel Hesap Makinesi")
self.root.geometry("400x600")
self.expression = ""
self.input_text = tk.StringVar()
self.create_widgets()
def create_widgets(self):
# Giriş ekranı
input_frame = tk.Frame(self.root, bd=10)
input_frame.pack()
input_field = tk.Entry(input_frame, font=('Arial', 20), textvariable=self.input_text, justify='right', bd=10, relief='ridge')
input_field.grid(row=0, column=0, ipadx=8, ipady=20, columnspan=5)
# Tuş takımı
button_frame = tk.Frame(self.root)
button_frame.pack()
buttons = [
['(', ')', '√', 'x²', 'C'],
['sin', 'cos', 'tan', 'log', 'ln'],
['7', '8', '9', '/', 'π'],
['4', '5', '6', '*', 'e'],
['1', '2', '3', '-', '^'],
['0', '.', '=', '+', 'DEL']
]
for i, row in enumerate(buttons):
for j, button in enumerate(row):
tk.Button(button_frame, text=button, width=6, height=2, font=('Arial', 14),
command=lambda b=button: self.on_button_click(b)).grid(row=i, column=j, padx=5, pady=5)
def on_button_click(self, char):
if char == 'C':
self.expression = ""
elif char == 'DEL':
self.expression = self.expression[:-1]
elif char == '=':
try:
# ifadesi güvenli değerlendir
self.expression = self.safe_eval(self.expression)
except Exception:
self.expression = "Hata"
elif char == 'π':
self.expression += str(math.pi)
elif char == 'e':
self.expression += str(math.e)
elif char == '√':
self.expression += "math.sqrt("
elif char == 'sin':
self.expression += "math.sin(math.radians("
elif char == 'cos':
self.expression += "math.cos(math.radians("
elif char == 'tan':
self.expression += "math.tan(math.radians("
elif char == 'log':
self.expression += "math.log10("
elif char == 'ln':
self.expression += "math.log("
elif char == 'x²':
self.expression += "**2"
elif char == '^':
self.expression += "**"
else:
self.expression += str(char)
self.input_text.set(self.expression)
def safe_eval(self, expr):
return str(eval(expr, {"math": math, "__builtins__": {}}))
# Uygulamayı başlat
if __name__ == "__main__":
root = tk.Tk()
calc = ScientificCalculator(root)
root.mainloop()
Bana bilimsel bir hesap makinesini TKinter arayüzünde yazar mısın dedim ve yukarıdaki kodu verdi.
Ve merak ettiğiniz soruyu sordum:
Burada buton event lerini nasıl bir yaklaşımla kullandın?
Cevap verdi:
Çok güzel bir soru! Bu kodda butonlara tıklama olaylarını yönetmek için lambda fonksiyonları ile dinamik olarak her butona özel bir işlev bağladım. Gel birlikte detaylı bakalım:
🧠 Butonların Event (Olay) Yönetimi Mantığı
Kodda şu satır kilit noktadır:
python
Copy
Edit
command=lambda b=button: self.on_button_click(b)
Bu satır, her bir buton için command parametresine bir lambda fonksiyonu tanımlar. Bu fonksiyon çalıştığında self.on_button_click(b) fonksiyonu çağrılır ve butonun metni (button) argüman olarak aktarılır.
👇 Adım Adım Açıklama
Örnek olarak butonlar listesinde bir sin butonu var. Bu kod:
python
Copy
Edit
tk.Button(button_frame, text='sin', ..., command=lambda b='sin': self.on_button_click(b))
gibi çalışır ve tıklanıldığında on_button_click('sin') fonksiyonu çağrılır.
🧩 Neden lambda b=button?
Eğer doğrudan lambda: self.on_button_click(button) yazsaydık, tüm butonlar en son butonun değerini alırdı (bu Python'un "late binding" davranışı). Bu yüzden:
python
Copy
Edit
lambda b=button: self.on_button_click(b)
şeklinde yazılarak her bir butonun kendi değerini saklaması sağlanır.
✅ Bu Yaklaşımın Avantajları
Kod tekrarını azaltır: Tek tek her buton için def ... tanımlamana gerek kalmaz.
Dinamik butonlar için idealdir: Butonları bir liste/dizi ile tanımlayıp döngüde işleyebilirsin.
Çok okunaklı ve kısa: İşlevselliği tek bir satırda tanımlayabiliyorsun.
İstersen bu yapıyı daha modüler hale getirebilir veya buton fonksiyonlarını ayrı metodlara bölerek kod okunabilirliğini daha da artırabiliriz. Yardımcı olayım mı bu konuda?
Açıklamalar bunlar.
Burada sizin kodunuzu incelememin nedeni şu.
Önce kodda hangi yaklaşımı uyguladığınızı araştırmakla vakit harcayacaktık. Doğru yada yanlış bir yaklaşım mı tartışma konusu olacaktı. Bu arada size birden çok soru sormak zorunda kalacaktık.
En basiti amerikayı yeniden keşfetmeden. Neden hesap makinesi kodu yazılır yöntemler nelerdir bakmak. Bunu yaptığınız takdirde daha az soru sorarak kendiniz balık tutabiirsiniz.
Kolay gelsin.