2013-04-25 15 views
6

Ive ha provato a cercare una soluzione ma non è riuscita a trovarne una che funzioni. Ho una lista 2d dei pulsanti tkinter e voglio cambiare il loro testo quando viene cliccato con il mouse. Ho provato a fare questo:Comandi del pulsante tkinter con lambda in Python

def create_board(number): 
    print(number) 
    for i in range (0,number): 
     buttonList.append([]) 
     for j in range(0,number): 
      print(i,j) 
      buttonList[i].append(Button(root, text = " ", command = lambda: update_binary_text(i,j))) 
      buttonList[i][j].pack() 

Poi quando viene cliccato chiama questa funzione:

def update_binary_text(first,second): 
    print(first,second) 
    buttonList[first][second]["text"] = "1" 

Quando fa clic su un pulsante, lo fa semplicemente nulla, ho avuto visualizzare il programma gli indici del tasto quello è stato cliccato, e TUTTI mostrano 4, 4 (questo è quando il numero variabile = 5) C'è una soluzione a questo?
questo è il mio primo tentativo di pitone per una classe.

Grazie

risposta

8

È possibile risolvere questo problema creando una chiusura per i e j con la creazione di ogni lambda:

command = lambda i=i, j=j: update_binary_text(i, j) 

Si potrebbe anche creare una fabbrica di callback con i riferimenti al pulsante stessi oggetti :

def callback_factory(button): 
    return lambda: button["text"] = "1" 

E poi nel codice di inizializzazione:

for j in range(0, number): 
    new_button = Button(root, text=" ") 
    new_button.configure(command=callback_factory(new_button)) 
    new_button.pack() 
    buttonList.append(new_button) 
+0

WOW! la tua soluzione ha funzionato! grazie Signore! Per ora mi sono bloccato con il primo esempio che hai postato. Ma sicuramente studierò il secondo esempio che hai mostrato. Grazie ancora! – vap

0

Ogni volta che ho bisogno di una raccolta di widget simili, trovo che sia più semplice racchiuderli in un oggetto e passare un metodo vincolato come richiamata piuttosto che giocare con lambda. Così, invece di avere una lista come buttonList[] con i widget, creare un oggetto:

class MyButton(object): 
    def __init__(self, i, j): 
     self.i = i 
     self.j = j 
     self.button = Button(..., command = self.callback) 

    def callback(self): 
     . . . 

Ora, avete una lista buttonList[] di questi oggetti, piuttosto che i widget stessi. Per aggiornare il testo, fornire un metodo, oppure accedere direttamente al membro: buttonList[i].button.configure(. . .) E quando la richiamata è attivata, ha l'intero oggetto e gli attributi che potrebbero essere necessari in self.

Problemi correlati