mirror of
https://github.com/wassname/scikit-image.git
synced 2026-07-19 11:27:45 +08:00
ENH: Overhaul callback system.
Remove `on_update` callback and add `on_move` and `on_release` callbacks arguments. Also, prefix callback functions with `callback_` for clarity.
This commit is contained in:
@@ -9,13 +9,18 @@ except ImportError:
|
||||
__all__ = ['CanvasToolBase', 'ToolHandles']
|
||||
|
||||
|
||||
def _pass(*args):
|
||||
pass
|
||||
|
||||
|
||||
class CanvasToolBase(object):
|
||||
"""Base canvas tool for matplotlib axes.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
"""
|
||||
def __init__(self, ax, useblit=True, on_update=None, on_enter=None):
|
||||
def __init__(self, ax, on_move=None, on_enter=None, on_release=None,
|
||||
useblit=True):
|
||||
self.ax = ax
|
||||
self.canvas = ax.figure.canvas
|
||||
self.cids = []
|
||||
@@ -26,13 +31,9 @@ class CanvasToolBase(object):
|
||||
self.connect_event('draw_event', self._blit_on_draw_event)
|
||||
self.useblit = useblit
|
||||
|
||||
if on_update is None:
|
||||
on_update = lambda *args: None
|
||||
self.on_update = on_update
|
||||
|
||||
if on_enter is None:
|
||||
on_enter = lambda *args: None
|
||||
self.on_enter = on_enter
|
||||
self.callback_on_move = _pass if on_move is None else on_move
|
||||
self.callback_on_enter = _pass if on_enter is None else on_enter
|
||||
self.callback_on_release = _pass if on_release is None else on_release
|
||||
|
||||
self.connect_event('key_press_event', self._on_key_press)
|
||||
|
||||
@@ -81,11 +82,10 @@ class CanvasToolBase(object):
|
||||
self.canvas.blit(self.ax.bbox)
|
||||
else:
|
||||
self.canvas.draw_idle()
|
||||
self.on_update(self.geometry)
|
||||
|
||||
def _on_key_press(self, event):
|
||||
if event.key == 'enter':
|
||||
self.on_enter(self.geometry)
|
||||
self.callback_on_enter(self.geometry)
|
||||
self.set_visible(False)
|
||||
self.redraw()
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ class LineTool(CanvasToolBase):
|
||||
"""
|
||||
Parameters
|
||||
----------
|
||||
on_update : function
|
||||
on_move : function
|
||||
Function accepting end points of line as the only argument.
|
||||
|
||||
Attributes
|
||||
@@ -23,10 +23,10 @@ class LineTool(CanvasToolBase):
|
||||
end_pts : 2D array
|
||||
End points of line ((x1, y1), (x2, y2)).
|
||||
"""
|
||||
def __init__(self, ax, x, y, on_update=None, on_enter=None, maxdist=10,
|
||||
lineprops=None):
|
||||
super(LineTool, self).__init__(ax, on_update=on_update,
|
||||
on_enter=on_enter)
|
||||
def __init__(self, ax, x, y, on_move=None, on_enter=None, on_release=None,
|
||||
maxdist=10, lineprops=None):
|
||||
super(LineTool, self).__init__(ax, on_move=on_move, on_enter=on_enter,
|
||||
on_release=on_release)
|
||||
|
||||
props = dict(color='r', linewidth=1, alpha=0.4, solid_capstyle='butt')
|
||||
props.update(lineprops if lineprops is not None else {})
|
||||
@@ -47,7 +47,7 @@ class LineTool(CanvasToolBase):
|
||||
def on_enter(pts):
|
||||
x, y = np.transpose(pts)
|
||||
print "length = %0.2f" % np.sqrt(np.diff(x)**2 + np.diff(y)**2)
|
||||
self.on_enter = on_enter
|
||||
self.callback_on_enter = on_enter
|
||||
|
||||
self.connect_event('button_press_event', self.on_mouse_press)
|
||||
self.connect_event('button_release_event', self.on_mouse_release)
|
||||
@@ -68,6 +68,7 @@ class LineTool(CanvasToolBase):
|
||||
if event.button != 1:
|
||||
return
|
||||
self._active_pt = None
|
||||
self.callback_on_release(self.geometry)
|
||||
|
||||
def on_move(self, event):
|
||||
if event.button != 1 or self._active_pt is None:
|
||||
@@ -75,6 +76,7 @@ class LineTool(CanvasToolBase):
|
||||
if not self.ax.in_axes(event):
|
||||
return
|
||||
self.update(event.xdata, event.ydata)
|
||||
self.callback_on_move(self.geometry)
|
||||
|
||||
def update(self, x, y):
|
||||
if x is not None:
|
||||
@@ -92,10 +94,13 @@ class LineTool(CanvasToolBase):
|
||||
|
||||
class ThickLineTool(LineTool):
|
||||
|
||||
def __init__(self, ax, x, y, on_update=None, on_enter=None, maxdist=10,
|
||||
lineprops=None):
|
||||
super(ThickLineTool, self).__init__(ax, x, y, on_update=on_update,
|
||||
on_enter=on_enter, maxdist=maxdist,
|
||||
def __init__(self, ax, x, y, on_move=None, on_enter=None, on_release=None,
|
||||
maxdist=10, lineprops=None):
|
||||
super(ThickLineTool, self).__init__(ax, x, y,
|
||||
on_move=on_move,
|
||||
on_enter=on_enter,
|
||||
on_release=on_release,
|
||||
maxdist=maxdist,
|
||||
lineprops=lineprops)
|
||||
|
||||
self.connect_event('scroll_event', self.on_scroll)
|
||||
|
||||
@@ -25,7 +25,6 @@ class RectangleTool(mwidgets.RectangleSelector, CanvasToolBase):
|
||||
rectprops : dict
|
||||
Properties for :class:`matplotlib.patches.Rectangle`. This class
|
||||
redefines defaults in :class:`matplotlib.widgets.RectangleSelector`.
|
||||
kwargs : see :class:`matplotlib.widgets.RectangleSelector`.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
@@ -33,10 +32,10 @@ class RectangleTool(mwidgets.RectangleSelector, CanvasToolBase):
|
||||
Rectangle extents: (xmin, xmax, ymin, ymax).
|
||||
"""
|
||||
|
||||
def __init__(self, ax, on_update=None, on_enter=None, rectprops=None,
|
||||
maxdist=10, **kwargs):
|
||||
CanvasToolBase.__init__(self, ax, on_update=on_update,
|
||||
on_enter=on_enter)
|
||||
def __init__(self, ax, on_move=None, on_enter=None, on_release=None,
|
||||
maxdist=10, rectprops=None):
|
||||
CanvasToolBase.__init__(self, ax, on_move=on_move,
|
||||
on_enter=on_enter, on_release=on_release)
|
||||
|
||||
props = dict(edgecolor=None, facecolor='r', alpha=0.15)
|
||||
props.update(rectprops if rectprops is not None else {})
|
||||
@@ -56,7 +55,7 @@ class RectangleTool(mwidgets.RectangleSelector, CanvasToolBase):
|
||||
if on_enter is None:
|
||||
def on_enter(extents):
|
||||
print "(xmin=%.3g, xmax=%.3g, ymin=%.3g, ymax=%.3g)" % extents
|
||||
self.on_enter = on_enter
|
||||
self.callback_on_enter = on_enter
|
||||
|
||||
props = dict(mec=props['edgecolor'])
|
||||
self._corner_order = ['NW', 'NE', 'SE', 'SW']
|
||||
@@ -112,6 +111,7 @@ class RectangleTool(mwidgets.RectangleSelector, CanvasToolBase):
|
||||
# Undo hiding of rectangle and redraw.
|
||||
self.set_visible(True)
|
||||
self.redraw()
|
||||
self.callback_on_release(self.geometry)
|
||||
|
||||
def press(self, event):
|
||||
self._set_active_handle(event)
|
||||
@@ -176,6 +176,7 @@ class RectangleTool(mwidgets.RectangleSelector, CanvasToolBase):
|
||||
self._edge_handles.set_data(*self.edge_centers)
|
||||
|
||||
self.redraw()
|
||||
self.callback_on_move(self.geometry)
|
||||
|
||||
@property
|
||||
def geometry(self):
|
||||
@@ -192,4 +193,4 @@ if __name__ == '__main__':
|
||||
rect_tool = RectangleTool(ax)
|
||||
plt.show()
|
||||
print "Final selection:",
|
||||
rect_tool.on_enter(rect_tool.extents)
|
||||
rect_tool.callback_on_enter(rect_tool.extents)
|
||||
|
||||
Reference in New Issue
Block a user