Connexion dynamique des emplacements et des signaux dans PyQt4
Dans PyQt4, la connexion par programme de plusieurs emplacements à des signaux peut entraîner un comportement inattendu lorsqu'elle est effectuée dans une boucle .
Problème :
Envisagez de créer une calculatrice avec des boutons numériques générés dynamiquement dans une boucle. Si le signal 'cliqué()' de chaque bouton est connecté comme suit :
def __init__(self): for i in range(0, 10): self._numberButtons += [QPushButton(str(i), self)] self.connect(self._numberButtons[i], SIGNAL('clicked()'), lambda : self._number(i))
Problème :
Lorsque l'on clique sur un bouton, ils impriment tous '9 '. Ce comportement découle de la sémantique de portée et de fermeture de Python. L'expression lambda fait référence à la variable i, qui, dans la boucle, est évaluée à la valeur finale, « 9 ».
Solution :
Pour éviter ce problème, transmettez i comme argument de mot-clé avec une valeur par défaut :
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
Vous pouvez également utiliser functools.partial pour une approche plus propre :
self._numberButtons[i].clicked.connect(partial(self._number, i))
Ces solutions isolent i dans l'expression lambda, garantissant que chaque le bouton déclenche l'action prévue lorsqu'il est 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!