Виджет PyQt connect() и disconnect()
в зависимости от условий я хотел бы подключить/повторно подключить кнопку к другой функции.
допустим, у меня есть кнопка:
myButton = QtGui.QPushButton()
для этого примера предположим, что я проверяю, есть ли подключение к интернету.
if connected == True:
myButton.clicked.connect(function_A)
elif connected == False:
myButton.clicked.connect(function_B)
прежде всего, я хотел бы отключить кнопку от любой функции, которую она уже была подключена, прежде чем кнопка будет повторно назначена/повторно подключена к другой функции (function_A или function_B). Во-вторых, я уже заметил, что после повторного подключения кнопки требуется дополнительный щелчок для кнопки, чтобы забрать новую функцию. После повторного подключения кнопки к другой функции она все еще пытается запустить предыдущую функцию-функцию, к которой кнопка была подключена ранее (до повторного подключения). Пожалуйста, совет. Заранее спасибо!
ОТРЕДАКТИРОВАНО ПОЗЖЕ:
появляется виджет .disconnect () метод можно использовать для того чтобы отключить кнопку от функции оно оно связанный.
myButton.disconnect()
к сожалению .disconnect () выдает ошибку, если виджет не подключен к какой-либо функции. Чтобы обойти это, я использую Try / Except. Но я бы предпочел более элегантное решение...
try: myButton.clicked.disconnect()
except Exception: pass
2 ответов
Если вам нужно повторно подключить сигналы во многих местах, то вы можете определить общую функцию утилиты следующим образом:
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
удаляет только одно соединение за раз.).
попробуйте это:
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_()