PyQt Widget conecta () y desconecta ()

Dependiendo de las condiciones, me gustaría conectar / reconectar un botón a una función diferente.

Digamos que tengo un botón:

myButton = QtGui.QPushButton() 

Para este ejemplo, digamos que compruebo si hay una conexión a Internet.

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

En primer lugar, me gustaría desconectar un botón de cualquier función que ya estaba conectada antes de que el botón se reasigne / vuelva a conectar a otra función (function_A o function_B). En segundo lugar, ya me he dado cuenta de que, una vez que se vuelve a conectar el botón, se necesita un clic adicional para que el botón seleccione una nueva función. Después de que el botón se vuelve a conectar a otra función, aún intenta ejecutar una función previa, una función a la que se conectó un botón antes (antes de una reconexión). Por favor aconséjame. ¡Gracias por adelantado!

EDITADO DESPUÉS:

Parece que se puede utilizar el método .disconnect () de un widget para desconectar un botón de una función a la que está conectado.

 myButton.disconnect() 

Desafortunadamente .disconnect () emite un error si un widget no está conectado a ninguna función. Para evitarlo estoy usando Try / Except. Pero preferiría usar una solución más elegante …

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

Si necesita volver a conectar las señales en muchos lugares, entonces podría definir una función de utilidad genérica como esta:

 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: el bucle es necesario para desconectar de manera segura un manejador específico, porque puede haber estado conectado varias veces y disconnect solo elimina una conexión a la vez).

Prueba esto:

 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_()