Does someone know how to programmatically know which editable shape is currently activated ?
I would like to allow the user to delete the selected shape by clicking a button. The only way found, was by forcing the user to first move the shape (the fillcolor is changed to red using the “on_change” callback). Then, I can detect the Red shape and delete it.
My approach is not elegant and apparently, the callback “on_change” is lost after the first click on the button (probably because the way I use to delete the shape but I haven’t found any proposal in the documentation)
Any help is more than welcome !
import plotly.graph_objects as go from ipywidgets import Button, VBox fig = go.FigureWidget() # Set axes properties fig.update_xaxes(range=[0, 7], showgrid=False) fig.update_yaxes(range=[0, 3.5]) shp1 = go.layout.Shape( type="rect", x0=1, y0=1, x1=2, y1=3, fillcolor="Blue", editable=True) shp2 = go.layout.Shape( type="rect", x0=3, y0=1, x1=6, y1=2, fillcolor="Blue", editable=True) # Add shapes fig.add_shape(shp1) fig.add_shape(shp2) fig.update_shapes(dict(xref='x', yref='y')) def change_color(shp,*args,**kwargs): shp.update(dict(fillcolor='Red')) def delete_shapes(*args,**kwargs): with output: try: list_shapes=[shp for shp in fig.layout.shapes if shp.fillcolor!='Red'] self.fig.update_layout(shapes=list_shapes) except Exception as e: raise e for shp in fig.layout.shapes: shp.on_change(change_color,'x0','y0','x1','y1') button.on_click(delete_shapes) VBox([button,fig])