matplotlib / ipympl

Matplotlib Jupyter Integration
https://matplotlib.org/ipympl/
BSD 3-Clause "New" or "Revised" License
1.57k stars 227 forks source link

Exception not handled in widgetlock() #471

Open delsuc opened 2 years ago

delsuc commented 2 years ago

Describe the issue

I want to use a selector matplotlib.widgets.RectangleSelector , it is incompatible with zoom and pan So I try to call widget lock to prevent user from using zoom in the same time.

minimum code:

%matplotlib ipympl
import matplotlib.pyplot as plt
fig,ax = plt.subplots()
ax.plot([0,1],[0,1])
fig.canvas.widgetlock(ax)   # get the widget lock

if you then hit the zoom or pan matplotlib button, which also try to get the lock, you get

ValueError                                Traceback (most recent call last)
File ~/spike/venvOW/lib/python3.9/site-packages/ipympl/backend_nbagg.py:279, in Canvas._handle_message(self, object, content, buffers)
    276     self.manager.handle_json(content)
    278 else:
--> 279     self.manager.handle_json(content)

...

File ~/spike/venvOW/lib/python3.9/site-packages/matplotlib/widgets.py:42, in LockDraw.__call__(self, o)
     40 """Reserve the lock for *o*."""
     41 if not self.available(o):
---> 42     raise ValueError('already locked')
     43 self._owner = o

ValueError: already locked

Alternatively, I could use the right click for the selector, but I have not found a way to restrict zoom and pan to left click only.

Versions

 3.9.7 (default, Sep 16 2021, 13:09:58) 
[GCC 7.5.0]
ipympl version: 0.8.8
Selected Jupyter core packages...
IPython          : 8.0.1
ipykernel        : 6.9.1
ipywidgets       : 7.6.5
jupyter_client   : 7.1.2
jupyter_core     : 4.9.2
jupyter_server   : 1.13.5
jupyterlab       : not installed
nbclient         : 0.5.11
nbconvert        : 6.4.2
nbformat         : 5.1.3
notebook         : 6.4.8
qtconsole        : 5.2.2
traitlets        : 5.1.1
ianhi commented 2 years ago

Hi @delsuc this is not an ipympl issue but rather a core matplotlib issue, I see the same behavior with the qt backend. I suggest you re-open this issue over there: https://github.com/matplotlib/matplotlib/issues/new/choose

delsuc commented 2 years ago

Thank you for the fast answer, ok, ok I admit I did not check outside ipympl. However, looking to the widgets.py code, which does nothing but raising an exception, I thought it was the charge was on the backend to handle the case. If qt does not do it either, then it means it is some kind of unfinished job. I'm going to open the issue in matplotlib but I believe I'll have to try to do it myself...