Maison >développement back-end >Tutoriel Python >Comment éviter un comportement inattendu lors de la liaison de commandes à des boutons créés dans une boucle Tkinter ?
Dans Tkinter, la création de boutons dans une boucle for peut présenter des défis lorsque l'on tente de lier la commande de chaque bouton avec un argument unique.
Considérez le scénario suivant :
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)
Lors de l'exécution de ce code, vous pourriez rencontrez un comportement étrange où appuyer sur n'importe quel bouton imprime toujours la même valeur, généralement la valeur de la dernière itération. Cela se produit parce que chaque fonction lambda créée dans la boucle fait référence à la même variable i, qui est mise à jour à chaque itération de la boucle.
Pour résoudre ce problème, vous pouvez exploiter les fermetures de Python en attribuant i à une nouvelle variable dans la fonction lambda, créant ainsi une portée unique pour chaque bouton. Voici le code modifié :
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 incorporant des fermetures, chaque fonction lambda capture la valeur i actuelle au moment de la définition, garantissant le comportement correct du bouton.
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!