PyQt小部件连接()和断开连接()

2024-04-19 01:57:36 发布

您现在位置:Python中文网/ 问答频道 /正文

根据不同的条件,我希望将按钮连接/重新连接到不同的功能。

假设我有一个按钮:

myButton = QtGui.QPushButton()

在这个例子中,假设我检查是否有internet连接。

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

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

首先,我希望在重新分配/重新连接到另一个功能(功能a或功能B)之前,将某个按钮与其已连接的任何功能断开连接。 其次,我已经注意到按钮重新连接后,需要额外单击按钮才能获取新功能。当按钮重新连接到另一个函数后,它仍然试图运行前一个函数-一个按钮先前连接到的函数(在重新连接之前)。请指教。提前谢谢!

稍后编辑:

似乎小部件的.disconnect()方法可用于将按钮与其连接的函数断开连接。

myButton.disconnect()

不幸的是,如果小部件未连接到任何函数,disconnect()将引发错误。 为了避开它,我使用Try/Except。但我宁愿用更优雅的方法。。。

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

Tags: 方法函数功能部件connectfunction条件按钮
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_()

如果需要在许多地方重新连接信号,则可以定义如下通用实用程序函数:

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一次只删除一个连接。)。

相关问题 更多 >