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
Libérer: 2024-12-20 00:51:11
original
356 Les gens l'ont consulté

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)
Copier après la connexion

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal