2013-07-16 12 views
21

Sto cercando di creare un paio di tasti (con una per) in questo modo:Tkinter assegnare il comando pulsante in loop con 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 

e per i pulsanti per ogni ottenere il loro proprio parametro (Test ottenendo test e Test2 ottiene Test2) ma quando premo i pulsanti entrambi stampano "Test2" che significa che stanno usando la stessa funzione con lo stesso parametro.

Come posso risolvere questo?

risposta

30

Il problema è la tua lamba nel ciclo for. Lambda utilizza la variabile name, ma la variabile name viene riassegnata ogni volta tramite il ciclo for. Alla fine, tutti i pulsanti ottengono l'ultimo valore a cui è stato assegnato name nel ciclo for. Per evitare questo è possibile utilizzare i parametri di default di parole chiave nella tua espressione Lamba in questo modo:

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

Questo associa il valore corrente della variabile name all'argomento name parola chiave della Lamba ogni volta attraverso il ciclo, producendo l'effetto desiderato.

+0

Grazie! funziona perfettamente ora: D – Shay

+0

Non è un problema di tkinter, è un problema riguardante la nidificazione di funzioni, chiusure, ecc. Esiste anche in altri contesti completamente diversi. Tuttavia +1, come altrimenti descrive esattamente cosa succede. – glglgl

+0

@glglgl Sei corretto al 100%. Non la migliore scelta di parole da parte mia, rivedrà. – mshildt

Problemi correlati