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 ?

Comment éviter un comportement inattendu lors de la liaison de commandes à des boutons créés dans une boucle Tkinter ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-20 00:51:11392parcourir

How to Avoid Unexpected Behavior When Binding Commands to Buttons Created in a Tkinter Loop?

Création de boutons de boucle Tkinter avec liaison d'arguments de commande

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.

Solution : utiliser des fermetures

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn