2009-10-08 23 views
8

Sto facendo una semplice piccola utility mentre imparo Python. Genera dinamicamente un elenco di pulsanti:Determina quale pulsante è stato premuto in Tkinter?

for method in methods: 
    button = Button(self.methodFrame, text=method, command=self.populateMethod) 
    button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3}) 

Questa parte funziona correttamente. Tuttavia, ho bisogno di sapere quale dei pulsanti è stato premuto all'interno di self.populateMethod. Qualche consiglio su come potrei essere in grado di dirlo?

risposta

15

È possibile utilizzare lambda per passare argomenti ad un comando:

def populateMethod(self, method): 
    print "method:", method 

for method in ["one","two","three"]: 
    button = Button(self.methodFrame, text=method, 
     command=lambda m=method: self.populateMethod(m)) 
    button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3}) 
1

Sembra che il metodo di comando non passi alcun oggetto evento.

Mi vengono in mente due soluzioni:

  • associato un callback unico per ogni pulsante

  • chiamata button.bind('<Button-1>', self.populateMethod) invece di passare self.populateMethod come command. self.populateMethod deve quindi accettare un secondo argomento che sarà un oggetto evento.

    Supponendo che questo secondo argomento sia chiamato event, event.widget è un riferimento al pulsante su cui è stato fatto clic.

+0

ho fatto il secondo metodo e sembra fare quello che voglio. Grazie! – Sydius

+0

Se usi 'bind' invece di sfruttare l'attributo' comando' incorporato perdi la capacità di usare l'abilità incorporata di Tkinter per navigare e fare clic sui pulsanti con la tastiera. Ovviamente, è possibile applicare un gruppo di associazioni per gestire tutti i casi speciali, ma è più semplice utilizzare l'attributo 'comando'. –

+0

@BryanOakley: anzi; il tuo suggerimento di usare lambda è molto più pulito. –

Problemi correlati