lambda

2013-07-16 28 views
21

I (bir) ile birkaç düğmeler oluşturmak için çalışıyorum şöyle ile döngü içinde düğme komutunu atamak Tkinter: Her almak içinlambda

def a(self, name): 
    print name 

users = {"Test":"127.0.0.0", "Test2":"128.0.0.0"} 
row = 1 
for name in users: 
    user_button = Tkinter.Button(self.root, 
           text=name, 
           command=lambda: self.a(name)) 
    user_button.grid(row = row, column = 0) 
    row+=1 

ve düğmeler için kendi parametre (Test alma Test ve Test2'nin Test2'ye girmesi) ancak butonlara bastığımda her ikisi de "Test2" yi yazdırıyorlar, yani aynı işlevi aynı işlevi kullanıyorlar.

Bunu nasıl çözebilirim?

cevap

30

Sorun, for döngüsündeki lambanızdır. Lambda, name değişkenini kullanıyor, ancak name değişkeni, for döngüsü boyunca her seferinde yeniden atandı. Sonuç olarak, tüm düğmeler name'un for döngüsünde atanmış olduğu son değeri alır. Bu kadar sevdiği lamba ifadesinde varsayılan anahtar kelime parametreleri kullanabilirsiniz kaçınmak için:

user_button = Tkinter.Button(self.root, 
          text=name, 
          command=lambda name=name: self.a(name)) 

Bu Lamba en name kelime tartışmaya name değişkenin geçerli değerini bağlayan her zaman döngü içinde, istenen etkiyi üreten.

+0

Teşekkür ederiz! Şu an mükemmel çalışıyor: D – Shay

+0

Bu bir sorun değil, fonksiyonların, kapakların, vb. yuvaların yerleştirilmesi ile ilgili bir konu. Tamamen başka bağlamlarda da var. Yine de, aksi takdirde tam olarak ne olduğunu açıkladığı gibi +1. – glglgl

+0

@glglgl% 100 doğru sizsiniz. Benim üzerimde en iyi kelime seçimi değil, gözden geçirilecek. – mshildt