Skip to content

BUG: #16220 doubled pick events for subclassed figure with a button #19610

Closed
@larsoner

Description

@larsoner

Bug report

Pick events are fired twice instead of once following #16220. This example is a bit wacky, but it's the minimal version of a much more complete GUI:

# -*- coding: utf-8 -*-

import numpy as np
from matplotlib.figure import Figure
from matplotlib.text import Text
import matplotlib  # noqa
from matplotlib.pyplot import figure
from matplotlib.widgets import Button
from mpl_toolkits.axes_grid1.axes_size import Fixed
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable
# matplotlib.use('Agg', force=True)


class Figure1(Figure):
    """Interactive figure with scrollbars, for data browsing."""

    def __init__(self, yticks, **kwargs):
        super().__init__(figsize=(6, 6))
        ax_main = self.add_subplot(1, 1, 1, position=[0.1, 0.1, 0.9, 0.9])
        div = make_axes_locatable(ax_main)
        ax_button = div.append_axes(position='bottom', size=Fixed(0.5), pad=0)
        self._button = Button(ax_button, 'Help')

        # main plot
        offsets = np.arange(len(yticks))
        ax_main.set(xlim=[0, 1], yticks=offsets)
        ax_main.set_yticklabels(yticks, picker=True)
        ax_main.plot([0, 1], [offsets, offsets])


picked = list()


def on_pick(event):
    """Handle matplotlib pick events."""
    if isinstance(event.artist, Text):
        ch_name = event.artist.get_text()
        print(f'pick {ch_name}')
        picked.append(ch_name)


yticks = list(x * 5 for x in 'ABCD')
fig = figure(FigureClass=Figure1, yticks=yticks)
fig.canvas.mpl_connect('pick_event', on_pick)
fig.canvas.draw()


ax = fig.axes[0]
x, y = ax.transData.transform_point((-0.1, 0))
func = fig.canvas.button_press_event(x=x, y=y, button=1, guiEvent=None)
assert 'AAAAA' in picked
assert len(picked) == 1, len(picked)

If you click on a ylabel (or simulate this with the code above), you get two pick events instead of one.

Screenshot from 2021-03-01 12-06-30

Actual outcome

On 6d79e6e / after #16220:

pick AAAAA
pick AAAAA
Traceback (most recent call last):
  File "/home/larsoner/Desktop/fig.py", line 52, in <module>
    assert len(picked) == 1, len(picked)
AssertionError: 2

Expected outcome

On 74d6145 / before #16220:

pick AAAAA

Matplotlib version

  • Matplotlib version (import matplotlib; print(matplotlib.__version__)): 6d79e6e or later
  • Matplotlib backend (print(matplotlib.get_backend())): Tested on Qt5Agg and Agg
  • Python version: 3.9.0

cc @anntzer since it was your PR that seems to have caused this.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions