Maison >développement back-end >Tutoriel Python >Comment puis-je transmettre correctement les variables de boucle aux commandes des boutons Tkinter ?
Dans Tkinter, créer des boutons dans une boucle peut être simple. Cependant, transmettre des arguments spécifiques à la commande de chaque bouton peut devenir délicat.
Considérez le scénario suivant dans lequel vous tentez de créer trois boutons avec les titres « Jeu 1 » à « Jeu 3 ». Vous avez l'intention de transmettre la valeur numérique correspondante à l'argument de la commande afin que lorsqu'un bouton est enfoncé, vous puissiez identifier quel bouton a déclenché l'action.
def createGameURLs(self): self.button = [] for i in range(3): self.button.append(Button(self, text='Game '+str(i+1), command=lambda: self.open_this(i))) self.button[i].grid(column=4, row=i+1, sticky=W) def open_this(self, myNum): print(myNum)
Malheureusement, ce code ne fonctionne pas comme prévu. Lorsqu'un bouton est enfoncé, la valeur imprimée est toujours 2, la dernière itération de la boucle. Le problème se pose car la fonction lambda utilise la valeur de i à la fin de la boucle, et non sa valeur à la création de chaque bouton.
Pour résoudre ce problème, vous besoin de créer une fermeture autour de la commande de chaque bouton. Ceci peut être réalisé en utilisant la syntaxe lambda i=i : self.open_this(i).
def createGameURLs(self): self.button = [] for i in range(3): self.button.append(Button(self, text='Game '+str(i+1), command=lambda i=i: self.open_this(i))) self.button[i].grid(column=4, row=i+1, sticky=W)
Avec cette modification, la commande de chaque bouton capture la valeur spécifique de i au moment de sa création. Lorsqu'un bouton est enfoncé, la fermeture garantit que la valeur correcte de i est transmise à la fonction open_this.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!