Closed
Description
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.
Actual outcome
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
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.