Dans Tkinter, créer plusieurs boutons dans une boucle peut être utile pour générer des interfaces utilisateur dynamiques. Cependant, transmettre des arguments de commande aux boutons peut présenter des défis, en particulier lorsque vous essayez de distinguer quel bouton a été enfoncé.
Considérez le code suivant, où les boutons sont créés avec leurs titres incrémentés par le compteur de boucles :
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)
Le problème survient lorsque nous essayons d'imprimer l'identifiant du bouton (myNum) en cliquant sur l'un d'entre eux. La sortie affiche systématiquement 2, la valeur de la dernière itération. Ce comportement indique que les boutons sont essentiellement impossibles à distinguer malgré leurs titres uniques.
Pour résoudre ce problème, nous devons nous assurer que chaque bouton capture sa propre valeur distincte de i au niveau moment de la création. Pour y parvenir, nous pouvons utiliser une technique intelligente avec les fonctions lambda :
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) def open_this(self, myNum): print(myNum)
En ajoutant l'affectation i=i dans la fonction lambda, nous "gelons" effectivement la valeur actuelle de i au moment où le lambda est défini. Cela garantit que chaque bouton conserve son identifiant unique même une fois la boucle terminée.
Cette technique nous permet de créer dynamiquement plusieurs boutons Tkinter dans une boucle, où chaque bouton peut être identifié de manière unique lorsque cliqué. En comprenant le comportement des fonctions et des fermetures lambda, nous pouvons obtenir plus de contrôle et de flexibilité dans nos applications Tkinter.
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!