ClydeTheGhost
ClydeTheGhost

Reputation: 1533

pyqt4: How to change button event without adding a new event?

I have a click button that I want to change events when the button is pressed. A minimal version of the existing code looks like this:

# 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)

Unfortunately, instead of changing the event that happens, it simply adds and event to the clicked signal, meaning that the following happens:

First button press - calls first_event

Second button press - calls first_event and second_event

Third button press - calls first_event twice and second_event

etc...

My desired behavior would be to have the button change functions when it is pressed, so that the resulting behavior would be:

First button press - calls first_event

Second button press - calls second_event

Third button press - calls first_event

etc...

Is there a way to make it so that it changes the click event instead of adding a new one? Is there a way to remove events after the fact?

Upvotes: 0

Views: 443

Answers (1)

ClydeTheGhost
ClydeTheGhost

Reputation: 1533

I found a way to separate old events from signals using the disconnect() method. Here is an edited version that accomplishes what I originally wanted to do:

# 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)

It's worth noting that instead of doing this, I eventually did what ekhumoro mentioned in the comments, and created a wrapper function with a flag to record the current state, and then call first_event() or second_event() based on the value of the flag.

Upvotes: 1

Related Questions