Maison > développement back-end > Tutoriel Python > Comment connecter dynamiquement les emplacements et les signaux dans PyQt4 sans comportement inattendu ?

Comment connecter dynamiquement les emplacements et les signaux dans PyQt4 sans comportement inattendu ?

DDD
Libérer: 2024-11-11 19:50:03
original
855 Les gens l'ont consulté

How to Connect Slots and Signals Dynamically in PyQt4 Without Unexpected Behavior?

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

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

Vous pouvez également utiliser functools.partial pour une approche plus propre :

self._numberButtons[i].clicked.connect(partial(self._number, i))
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal