web-dev-qa-db-fra.com

PyQt Widget connecter () et déconnecter ()

Selon les conditions, je voudrais connecter/reconnecter un bouton à une fonction différente.

Disons que j'ai un bouton:

myButton = QtGui.QPushButton()

Pour cet exemple, disons que je vérifie s'il existe une connexion Internet.

if connected == True:
    myButton.clicked.connect(function_A)

Elif connected == False:
    myButton.clicked.connect(function_B)

Tout d'abord, je voudrais déconnecter un bouton de n'importe quelle fonction qu'il était déjà connecté avant que le bouton ne soit réaffecté/reconnecté à une autre fonction (function_A ou function_B). Deuxièmement, j'ai déjà remarqué qu'après la reconnexion du bouton, il fallait un clic supplémentaire pour que le bouton prenne une nouvelle fonction. Une fois que le bouton est reconnecté à une autre fonction, il tente toujours d'exécuter une fonction précédente - une fonction à laquelle un bouton a été connecté plus tôt (avant une reconnexion). Veuillez conseiller. Merci d'avance!

MODIFIÉ PLUS TARD:

Il semble que la méthode . Déconnecter () d'un widget puisse être utilisée pour déconnecter un bouton d'une fonction à laquelle il est connecté.

myButton.disconnect()

Malheureusement .disconnect () génère une erreur si un widget n'est connecté à aucune fonction. Pour contourner ce problème, j'utilise Try/Except. Mais je préfère utiliser une solution plus élégante ...

try: myButton.clicked.disconnect() 
except Exception: pass
19
alphanumeric

Si vous devez reconnecter des signaux à de nombreux endroits, vous pouvez définir une fonction utilitaire générique comme celle-ci:

def reconnect(signal, newhandler=None, oldhandler=None):
    while True:
        try:
            if oldhandler is not None:
                signal.disconnect(oldhandler)
            else:
                signal.disconnect()
        except TypeError:
            break
    if newhandler is not None:
        signal.connect(newhandler)

...

if connected:
    reconnect(myButton.clicked, function_A)
else:
    reconnect(myButton.clicked, function_B)

(NB: la boucle est nécessaire pour déconnecter en toute sécurité un gestionnaire spécifique, car il peut avoir été connecté plusieurs fois, et disconnect ne supprime qu'une seule connexion à la fois.).

20
ekhumoro

Essaye ça:

from PyQt4 import QtGui as gui

app = gui.QApplication([])

myButton = gui.QPushButton()

def function_A():
    myButton.clicked.disconnect() #this disconnect all!
    myButton.clicked.connect(function_B)
    print 'function_A'

def function_B():
    myButton.clicked.disconnect(function_B) #this disconnect function_B
    myButton.clicked.connect(function_A)
    print 'function_B'

myButton.clicked.connect(function_A)
myButton.setText("Click me!")
myButton.show()

app.exec_()
6
Alvaro Fuentes