2013-07-16 6 views
21

Ich versuche, ein paar Knöpfe zu erstellen (mit einem für) etwa so:Tkinter Schaltfläche Befehl in Schleife zuweisen mit 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 

und für die Tasten jeweils ihre eigenen Parameter erhalten (Test bekommt Test- und Test2 bekommt Test2), aber wenn ich die Tasten drücke, drucken beide "Test2", was bedeutet, dass sie dieselbe Funktion mit dem gleichen Parameter verwenden.

Wie kann ich das lösen?

Antwort

30

Das Problem ist Ihre Lamba in der For-Schleife. Ihr Lambda verwendet die Variable name, aber die Variable name wird jedes Mal durch die for-Schleife neu zugewiesen. Am Ende erhalten alle Schaltflächen den letzten Wert, der in der for-Schleife name zugewiesen wurde. Um dies zu vermeiden Sie Standard-Keyword-Parameter in Ihrem lamba Ausdruck wie so verwenden können:

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

Dieser bindet den aktuellen Wert des name Variable auf die name Schlüsselwort Argument der lamba jedes Mal durch die Schleife, um die gewünschte Wirkung zu erzeugen.

+0

Vielen Dank! funktioniert jetzt einwandfrei: D – Shay

+0

Es handelt sich nicht um ein Problem, sondern um ein Problem bei der Verschachtelung von Funktionen, Schließungen usw. Es existiert auch in völlig anderen Zusammenhängen. Trotzdem +1, wie es sonst genau beschreibt, was passiert. – glglgl

+0

@glglgl Sie sind zu 100% korrekt. Nicht die beste Wortwahl meinerseits, wird revidieren. – mshildt

Verwandte Themen