根据条件,我想将按钮连接/重新连接到不同的功能。
假设我有一个按钮:
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
答案 0 :(得分:14)
如果您需要在许多地方重新连接信号,那么您可以定义一个通用的实用程序函数:
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)
(注意:安全断开特定处理程序需要循环,因为它可能连接多次,disconnect
一次只删除一个连接。)。
答案 1 :(得分:5)
试试这个:
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_()