pyqt4:如何在不添加新事件的情况下更改按钮事件?

时间:2016-08-08 14:41:34

标签: python events signals pyqt4

我有一个单击按钮,我想在按下按钮时更改事件。现有代码的最小版本如下所示:

# Event that happens the first time
def first_event(self):
    button.setText("Second Event")
    button.clicked.connect(second_event)

# Event that happens the second time
def second_event(self):
    button.setText("First Event")
    button.clicked.connect(first_event)

button = QtGui.QPushButton("First Event")
button.clicked.connect(first_event)

不幸的是,不是更改发生的事件,只是添加和事件到点击的信号,这意味着发生以下情况:

按下第一个按钮 - 调用first_event

按下第二个按钮 - 调用first_event和second_event

第三次按下按钮 - 两次调用first_event和second_event

等...

我希望的行为是按下按钮时更改功能,以便产生的行为是:

按下第一个按钮 - 调用first_event

按下第二个按钮 - 调用second_event

按第三个按钮 - 调用first_event

等...

有没有办法让它改变点击事件而不是添加新事件?事后是否有办法删除事件?

1 个答案:

答案 0 :(得分:1)

我找到了一种使用disconnect()方法将旧事件与信号分开的方法。这是一个完成我原本想要做的编辑版本:

# Event that happens the first time
def first_event(self):
    button.setText("Second Event")
    button.clicked.disconnect()
    button.clicked.connect(second_event)

# Event that happens the second time
def second_event(self):
    button.setText("First Event")
    button.clicked.disconnect()
    button.clicked.connect(first_event)

button = QtGui.QPushButton("First Event")
button.clicked.connect(first_event)

值得注意的是,我最终没有这样做,我最终做了ekhumoro在评论中提到的内容,并创建了一个带有标记的包装函数来记录当前状态,然后调用first_event()或{ {1}}基于旗帜的价值。