PyQt Widget connect() и отключить()

В зависимости от условий я хотел бы подключить/повторно подключить кнопку к другой функции.

Скажем, у меня есть кнопка:

myButton = QtGui.QPushButton()

В этом примере скажем, я проверяю, есть ли интернет-соединение.

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

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

Прежде всего, я хотел бы отключить кнопку от любой функции, которую он уже подключил, прежде чем кнопка будет повторно назначена/повторно подключена к другой функции (function_A или function_B). Во-вторых, я уже заметил, что после повторного подключения кнопки требуется дополнительный щелчок кнопки, чтобы выбрать новую функцию. После того, как кнопка повторно подключена к другой функции, она по-прежнему пытается запустить предыдущую функцию - функцию, с которой ранее была подключена кнопка (перед повторным подключением). Пожалуйста посоветуй. Спасибо заранее!

EDITED LATER:

Появится виджет .disconnect() метод может быть использован для отключения кнопки от функции, с которой он подключен.

myButton.disconnect()

К сожалению .disconnect() выдает ошибку, если виджет не подключен к какой-либо функции. Чтобы обойти это, я использую Try/Except. Но я предпочел бы использовать более элегантное решение...

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

Ответ 1

Если вам нужно повторно подключить сигналы во многих местах, вы можете определить общую функцию утилиты, например:

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: цикл необходим для безопасного отключения конкретного обработчика, поскольку он может быть подключен многократно, а disconnect удаляет только одно соединение за раз.).

Ответ 2

Попробуйте следующее:

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