2013-07-16 9 views
21

Próbuję utworzyć kilka przycisków (z tytułu) tak:Tkinter polecenie przycisku przypisać w pętli z lambda

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 

i za pomocą przycisków na każdy dostać własnych parametrów (i coraz Test Test Test2 otrzymuje Test2), ale kiedy wciskam przyciski, oba drukują "Test2", co oznacza, że ​​używają tej samej funkcji z tym samym parametrem.

Jak mogę to rozwiązać?

Odpowiedz

30

Problemem jest Twoja lamba w pętli for. Twoja lambda używa zmiennej name, ale zmienna name jest ponownie przypisywana za każdym razem przez pętlę for. Ostatecznie wszystkie przyciski otrzymują ostatnią wartość, do której przypisano name w pętli for. Aby tego uniknąć, można stosować parametry domyślne słów kluczowych w swojej wypowiedzi Lamba tak:

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

To wiąże się bieżącą wartość zmiennej name do name kluczowego argumentu Lamba za każdym razem przez pętlę, tworząc pożądany efekt.

+0

Dziękujemy! działa teraz idealnie: D – Shay

+0

To nie jest zagadnienie tkinter, jest to problem dotyczący zagnieżdżania funkcji, zamknięć itp. To również istnieje w zupełnie innych kontekstach. Niemniej jednak +1, ponieważ w inny sposób dokładnie opisuje to, co się dzieje. – glglgl

+0

@glglgl Masz 100% poprawności. Nie najlepszy wybór słów z mojej strony, ulegnie zmianie. – mshildt