Connexion des emplacements et des signaux PyQt4 dans une boucle : dépannage des résultats inattendus
Lors de la construction d'une calculatrice dans PyQt4, le bouton de connexion 'cliqué()' les signaux dans une boucle peuvent conduire à un comportement inattendu. Le problème se pose car le numéro attendu n’est pas imprimé lorsque l’on clique sur un bouton. Au lieu de cela, tous les boutons impriment le même numéro.
Comprendre le problème
Les règles de portée de Python créent une fermeture dans ce scénario. La variable de boucle « i » est utilisée comme paramètre pour la fonction lambda de chaque bouton. Cependant, Python résout « i » dans l’espace de noms de la fonction englobante (__init__()). Puisque « i » est modifié dans la boucle et finalement attribué la valeur de 9, tous les boutons font référence à la même fermeture, ils génèrent donc tous « 9 », quel que soit le bouton sur lequel vous avez cliqué.
Résoudre le Problème
Pour résoudre ce problème, nous pouvons passer « i » comme argument de mot-clé avec une valeur par défaut. Cela introduit une nouvelle liaison pour « i » dans l'espace de noms de la fonction lambda, la rendant indépendante de « i » dans __init__().
Solution utilisant l'argument de mot-clé :
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
Solution utilisant functools.partial :
Une autre approche consiste à utiliser functools.partial, qui crée une fonction partielle avec des arguments pré-liés. Cela rend le code plus lisible et élimine l'utilisation d'arguments de mots clés.
self._numberButtons[i].clicked.connect(partial(self._number, i))
En mettant en œuvre ces solutions, chaque bouton imprimera le numéro souhaité lorsqu'il sera cliqué.
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!