Tkinter bind komutunda fonksiyonun sağına () ekleyince çalıştırıyor

yusufYAZICI155

Hectopat
Katılım
3 Ocak 2021
Mesajlar
283
Çözümler
2
Merhaba Python'da bir program yapıyorum yapay zeka üzerine kendi kafama göre yapıyorum.
Şu anda arayüzü bitirmiş gibiyim.

Şimdi tkinter modülününde bind diye bir komut var.
1645699329276.png

Şu an bu komutu uygulayıp geçiyor yani metin_button adlı butona bastığımızda TextBoxTurnBIND fonksiyonu çalışacak.
Burada bir sorun yok.
1645699394657.png

Fakat böyle yaptığımızda satırı geçmiyor ve tıklamasan bile fonksiyonu uyguluyor.
Bu neden böyle şimdi
1645699462776.png

Parantezin içine değer atamam gerektiğinde fonksiyonu çalıştırıyor.

Şunu istiyorum fonksiyona bir kod vereceğim bu koda göre işlem yapmasını istiyorum. Ama işte değer verdiğimde fonksiyonu uyguluyor.
 
Bunun sebebi func() yazdığın zaman fonksiyon çağrı operatörünün devreye girmesi, bunun sonucunda fonksiyonun return ettiği değer döndürülür yoksa da none döner. func yazdığın zaman ise fonksiyonun bellek adresi döndürülür. Burada bind fonksiyonunun aldığı parametre bir fonksiyon bellek adresi, ben olsaydım bir class yazardım init ile parametreleri initialize ederdim call ile de fonksiyon çağrı operatörünü kullanırdım.

Örneğin;

Python:
class function:
    def __init__(self, a ,b):
        self.a = a
        self.b = b
    def __call__(self, event):
        print("call", self.a, self.b)
        
metin_button.bind("<Button-1>" , function("d", "c"))
 
Bunun sebebi func() yazdığın zaman fonksiyon çağrı operatörünün devreye girmesi, bunun sonucunda fonksiyonun return ettiği değer döndürülür yoksa da none döner. func yazdığın zaman ise fonksiyonun bellek adresi döndürülür. Burada bind fonksiyonunun aldığı parametre bir fonksiyon bellek adresi, ben olsaydım bir class yazardım init ile parametreleri initialize ederdim call ile de fonksiyon çağrı operatörünü kullanırdım.

Örneğin;

Python:
class function:
    def __init__(self, a ,b):
        self.a = a
        self.b = b
    def __call__(self, event):
        print("call", self.a, self.b)
       
metin_button.bind("<Button-1>" , function("d", "c"))
Ben return edip etmemesinden bahsetmiyorumki fonksiyon için () koyunca fonksiyonu direkt uyguluyor.

Ben diyorumki butona sol tık yapıldığında çalışmasını istiyorum açıl açılmaz fonksiyon çalışıyor. Hem de butona tıklamamış olmama rağmen.
 
Ben return edip etmemesinden bahsetmiyorumki fonksiyon için () koyunca fonksiyonu direkt uyguluyor.

Ben diyorumki butona sol tık yapıldığında çalışmasını istiyorum açıl açılmaz fonksiyon çalışıyor. Hem de butona tıklamamış olmama rağmen.
bunun için lambda anahtar kelimesini kullanmalısınız. Bir fonksiyon sizinde bildiğiniz üzere parantez aç kapa yapılarak çağırılır. Peki lambda burada ne işe yarıyor. Aslında lambda da tek satırlık fonksiyon yazmamızı sağlayan bir anahtar kelime. İstersek bir değişkene atayıp yazabilir ve değişkeni çağırarak fonksiyonu çalıştırabiliriz istersek te bir değişken tanımlamadan veya fonksiyon ismi tanımlamadan yapacağımız işleme göre lambda anahtar kelimesini belirtip başka bir fonksiyonu çağırabiliriz, karmaşık tek satırlık kod yazabiliriz....


[CODE lang="python" title="lambda anahtar kelimesi kullanım" highlight="1"]######################### ÖRN #####################
class BlaBla:
def __init__(self):
pass
def falan(self):
return "filan"

metin_button.bind("<Button-1>", lambda: BlaBla().filan())
[/CODE]
 

Technopat Haberler

Geri
Yukarı