有什么方法可以将不同的点击处理程序绑定到 PyQt5 中的 QPushButton?
Is there any way to bind a differnt click handler to QPushButton in PyQt5?
我有一个 QPushbutton
:
btn = QPushButton("Click me")
btn.clicked.connect(lambda: print("one"))
稍后在我的程序中,我想重新绑定它的点击处理程序,我试图通过再次调用 connect
来实现:
btn.clicked.connect(lambda: print("two"))
我希望看到控制台只打印 two
,但实际上它同时打印了 one
和 two
。换句话说,我实际上将两个点击处理程序绑定到按钮。
如何重新绑定点击处理程序?
Qt 中的信号和槽是观察者模式(pub-sub)实现,许多对象可以订阅同一个信号并订阅多次。他们可以使用 disconnect
功能取消订阅。
from PyQt5 import QtWidgets, QtCore
if __name__ == "__main__":
app = QtWidgets.QApplication([])
def handler1():
print("one")
def handler2():
print("two")
button = QtWidgets.QPushButton("test")
button.clicked.connect(handler1)
button.show()
def change_handler():
print("change_handler")
button.clicked.disconnect(handler1)
button.clicked.connect(handler2)
QtCore.QTimer.singleShot(2000, change_handler)
app.exec()
在 lambda 的情况下,您只能使用 disconnect()
(不带参数)一次断开所有订阅者,这适用于按钮情况。
我有一个 QPushbutton
:
btn = QPushButton("Click me")
btn.clicked.connect(lambda: print("one"))
稍后在我的程序中,我想重新绑定它的点击处理程序,我试图通过再次调用 connect
来实现:
btn.clicked.connect(lambda: print("two"))
我希望看到控制台只打印 two
,但实际上它同时打印了 one
和 two
。换句话说,我实际上将两个点击处理程序绑定到按钮。
如何重新绑定点击处理程序?
Qt 中的信号和槽是观察者模式(pub-sub)实现,许多对象可以订阅同一个信号并订阅多次。他们可以使用 disconnect
功能取消订阅。
from PyQt5 import QtWidgets, QtCore
if __name__ == "__main__":
app = QtWidgets.QApplication([])
def handler1():
print("one")
def handler2():
print("two")
button = QtWidgets.QPushButton("test")
button.clicked.connect(handler1)
button.show()
def change_handler():
print("change_handler")
button.clicked.disconnect(handler1)
button.clicked.connect(handler2)
QtCore.QTimer.singleShot(2000, change_handler)
app.exec()
在 lambda 的情况下,您只能使用 disconnect()
(不带参数)一次断开所有订阅者,这适用于按钮情况。