Connexion des emplacements et des signaux dans PyQt4 dans une boucle : rompre la chaîne de liaison
Dans cet article, nous abordons un problème courant rencontré lors de la connexion clicked() signaux à partir de boutons créés dans une boucle dans PyQt4. Notre objectif est de comprendre pourquoi tous les boutons affichent la même valeur, même si l'on s'attend à ce que chaque bouton déclenche une action unique en fonction de son étiquette.
Comprendre la portée et la fermeture
Le comportement observé dans l'exemple fourni est une conséquence des mécanismes de portée et de fermeture de Python. Lors de la création de boutons dans une boucle, nous essayons de connecter leurs signaux clicked() à une fonction lambda. Cependant, Python introduit uniquement de nouvelles liaisons dans un espace de noms via des listes d'affectations ou de paramètres de fonctions.
Par conséquent, la fonction lambda n'a pas sa propre liaison pour la variable de boucle i, et la recherche à la place dans l'espace de noms de la fonction englobante, __init__(). Au moment où le lambda est exécuté, sa valeur finale de 9 a déjà été attribuée à i, ce qui fait que tous les boutons impriment la même sortie.
Résolution
À adresser ce problème, nous pouvons passer i comme argument de mot-clé avec une valeur par défaut à la fonction lambda. Cela garantit que i dans le lambda est indépendant de i dans __init__(). Alternativement, nous pouvons utiliser la fonction functools.partial, qui propose une approche plus lisible et moins « magique » pour obtenir le même résultat.
Exemple avec argument de mot clé :
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
Exemple avec functools.partial :
self._numberButtons[i].clicked.connect(partial(self._number, i))
En mettant en œuvre l'une de ces approches, nous pouvons réussir à établir la liaison souhaitée entre chaque bouton et son action respective.
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!