PyQt Widget connect() and disconnect()
click, disconnect, pyqt, python, signals-slots
Solution
If you need to reconnect signals in many places, then you could define a generic utility function like this:
def reconnect(signal, newhandler=None, oldhandler=None):
try:
if oldhandler is not None:
while True:
signal.disconnect(oldhandler)
else:
signal.disconnect()
except TypeError:
pass
if newhandler is not None:
signal.connect(newhandler)
...
if connected:
reconnect(myButton.clicked, function_A)
else:
reconnect(myButton.clicked, function_B)
(NB: the loop is needed for safely disconnecting a specific handler, because it may have been connected multple times, and `disconnect(slot)` only removes one connection at a time.).
Problem
Depending on a conditions I would like to connect/re-connect a button to a different function. Let's say I have a button: ``` myButton = QtGui.QPushButton() ``` For this example let's say I check if there is an internet connection. ``` if connected == True: myButton.clicked.connect(function_A) elif connected == False: myButton.clicked.connect(function_B) ``` First of all I would like to disconnect a button from any function it was already connected before the button is being re-assigned/re-connected to another function (function_A or function_B). Secondly, I have already noticed that after the button is re-connected it takes an extra click for the button to pick up a new function. After the button is re-connected to another function it still attempts to run a previous function - a function to which a button was connected earlier (before a re-connection). Please advice. Thanks in advance! EDITED LATER: It appears a widget's .disconnect() method can be used to disconnect a button from a function it it is connected. ``` myButton.disconnect() ``` Unfortunately .disconnect() throws an error if a widget is not connected to any function. To get around it I am using Try/Except. But I would rather use a more elegant solution... ``` try: myButton.clicked.disconnect() except Exception: pass ```