Tkinter (buton) fonksiyon çağırma

Merhabalar. Aşağıdaki kodda butona basılınca butona eklediğim fonksiyondaki sayının 5 artmasını istiyorum fakat ben butona basmadan ekrana basıyor. Nerede hata yapmış olabilirim?

from tkinter import *

root = Tk()

def artır(x):
    print(x + 5)

Button(root, text="artır", command=artır(5)).pack()

mainloop()

Böyle bir kullanımda önce artır(5) kısmı çalıştırılır, daha sonra geri döndürdüğü değer (yani burada None) command parametresi olur. Bu yüzden fonksiyon en başta çalışıyor ve bir daha çalışmıyor. Bir lambda fonksiyon ile bu işi halledebilirsiniz:

Button(root, text="artır", command = lambda: artır(5) )
Button.pack()

Merhaba. Öneriniz için tşkler. Yalnız ben o kodu test olarak yazdım. butona bastığımda yalnızca lambda ile yapamayacağım başka kodlar da olacak. Bunun için önerileriniz var mı?

Sarıcı bir fonksiyon kullanabilirsiniz.

import tkinter as tk

root = tk.Tk()


def sarici(x):

    def artir():
        print(x + 5)

    return artir


button = tk.Button(root, text="artır", command=sarici(5))
button.pack()

root.mainloop()
1 Beğeni

Eğer lambda fonksiyonlar işinizi görmüyorsa normal bir fonksiyon olarak oluşturabilirsiniz (@dildeolupbiten’in örneğindeki gibi). Sonuçta lambda fonksiyonlar sadece daha az kod yazmamızı sağlıyor.

Dünden bugüne hallettim o problemi yardımlarınızla tşkler. Şimdi de başka bir kod parçacığında aklım karıştı.

from tkinter import *

root = Tk()

numbers_dict = {}

def show(temp):
    print(temp)

def put():
    for i in range(1, 3):
            numbers_dict[str(i)] = Button(root, text=i, command=lambda:show(i))
            numbers_dict[str(i)].pack()
put()

root.mainloop()

Yukarıdaki programda 2 adet buton oluşturuyorum. Sonrasında butona tıkladığımda buton değerini ekrana basmasını istiyorum ama başarılı olamıyorum. 1 yazan butona da bassam 2 ye de bassam sonuç olarak 2 yazıyor. Nerede hata yapıyorum?

Böyle durumlarda sarıcı bir fonksiyon kullanın.

import tkinter as tk

root = tk.Tk()

numbers_dict = {}


def sarici(temp):

    def show():
        print(temp)

    return show


def put():
    for i in range(1, 3):
        numbers_dict[str(i)] = tk.Button(root, text=i, command=sarici(i))
        numbers_dict[str(i)].pack()


put()
root.mainloop()
1 Beğeni

Closure’larin gazabına uğramışsınız :slightly_smiling_face:

Yardımınız için çok tşkler :slight_smile:

Düşe kalka öğreneceğim inşallah :slight_smile: