Circle object select/de-select


I am having a problem with one part of my experiment. I have coded a multiple object tracking task. I have below the “runCondition” def that show circles objects, make them move around the screen and then have participants select the circles they tracked.

My problem is with the circle selection part, toward the bottom. What I would like (what I tried to code) is to have participants be able to select and de-select circles as they want within the 15 seconds they have to answer.

The problem is that there is a weird behavior happening when I run the task: I have to click several times on the “correct” circles to select or de-select them. It is bugging, and I cannot pinpoint what would do that in my code.

Here is the code:

def runCondition(self, nRedCircles, initialCircleTime, circlesMovingTime1, redCircleTime, circlesMovingTime2):
    mouse = event.Mouse()
    # Show circles
    for c in self.circles:
        c.visual.autoDraw = True
    # Move circles
    # Change circles color
    for c in self.circles[:nRedCircles]:
        c.setColor("maroon", self.cDefaultLineWidth)
    # Reset circles colors
    for c in self.circles[:nRedCircles]:
        c.setColor(self.cDefaultColor, self.cDefaultLineWidth)
    # Moving circles
    # Clean keys buffer
    # Circle selection
    selection = [False] * self.nCircles
    reactionStartTime = time.perf_counter()
    selectionStartTime = time.perf_counter()
    selectionEndTime = selectionStartTime + self.selectionTimeout
    nSelections = 0
    spacebarPressed = False
    mouse = event.Mouse()
    click_delay = 0.05
    while not (spacebarPressed and nSelections > 0) and time.perf_counter() < selectionEndTime:
        if mouse.getPressed()[0]:
            clicked_circles = [i for i, c in enumerate(self.circles) if mouse.isPressedIn(c.visual)]
            for i in range(len(self.circles)):
                c = self.circles[i]
                if i in clicked_circles:
                    if not selection[i]:  # If the circle is not selected, select it
                        c.visual.lineColor = self.cSelectionLineColor
                        c.visual.lineWidth = self.cSelectionLineWidth
                        selection[i] = True
                        nSelections += 1
                        spacebarPressed = False
                        print(f"Circle {i} selected. nSelections: {nSelections}")
                    else:  # If the circle is already selected, deselect it
                        c.visual.lineColor = self.cDefaultColor
                        c.visual.lineWidth = self.cDefaultLineWidth
                        selection[i] = False
                        nSelections -= 1
                        spacebarPressed = False
                        print(f"Circle {i} deselected. nSelections: {nSelections}")
        spacebarPressed = len(event.getKeys(keyList=["space"])) > 0
    reactionElapsedTime = time.perf_counter() - reactionStartTime
    # Hide circles
    for c in self.circles:
        c.visual.autoDraw = False
    # Results
    correctAnswers = selection[:nRedCircles].count(True)
    wrongAnswers = selection[nRedCircles:].count(True)
    return reactionElapsedTime, correctAnswers, wrongAnswers

I would appreciate any help in changing this code, or implementing a new one if somebody had the same problem before! I can also share the entire code if necessary.

Thank you!