diff --git a/IPython/html/widgets/interaction.py b/IPython/html/widgets/interaction.py index 8316381ac..d3d533727 100644 --- a/IPython/html/widgets/interaction.py +++ b/IPython/html/widgets/interaction.py @@ -40,7 +40,7 @@ def _matches(o, pattern): return all(isinstance(obj,kind) for obj,kind in comps) -def _get_min_max_value(min, max, value): +def _get_min_max_value(min, max, value=None, step=None): """Return min, max, value given input values with possible None.""" if value is None: if not max > min: @@ -60,6 +60,10 @@ def _get_min_max_value(min, max, value): raise TypeError('expected a number, got: %r' % value) else: raise ValueError('unable to infer range, value from: ({0}, {1}, {2})'.format(min, max, value)) + if step: + # ensure value is on a step + r = (value - min) % step + value = value - r return min, max, value def _widget_abbrev_single_value(o): @@ -85,19 +89,19 @@ def _widget_abbrev(o): """Make widgets from abbreviations: single values, lists or tuples.""" if isinstance(o, (list, tuple)): if _matches(o, (int, int)): - min, max, value = _get_min_max_value(o[0], o[1], None) + min, max, value = _get_min_max_value(o[0], o[1]) return IntSliderWidget(value=value, min=min, max=max) elif _matches(o, (int, int, int)): - min, max, value = _get_min_max_value(o[0], o[1], None) + min, max, value = _get_min_max_value(o[0], o[1], step=o[2]) return IntSliderWidget(value=value, min=min, max=max, step=o[2]) elif _matches(o, (float, float)): - min, max, value = _get_min_max_value(o[0], o[1], None) + min, max, value = _get_min_max_value(o[0], o[1]) return FloatSliderWidget(value=value, min=min, max=max) elif _matches(o, (float, float, float)): - min, max, value = _get_min_max_value(o[0], o[1], None) + min, max, value = _get_min_max_value(o[0], o[1], step=o[2]) return FloatSliderWidget(value=value, min=min, max=max, step=o[2]) elif _matches(o, (float, float, int)): - min, max, value = _get_min_max_value(o[0], o[1], None) + min, max, value = _get_min_max_value(o[0], o[1], step=o[2]) return FloatSliderWidget(value=value, min=min, max=max, step=float(o[2])) elif all(isinstance(x, string_types) for x in o): return DropdownWidget(value=unicode_type(o[0]),