diff --git a/IPython/html/widgets/widget_float.py b/IPython/html/widgets/widget_float.py
index 1fae1d47c..dc08afd90 100644
--- a/IPython/html/widgets/widget_float.py
+++ b/IPython/html/widgets/widget_float.py
@@ -68,10 +68,13 @@ class _FloatRange(_Float):
upper = CFloat(1.0, help="Upper bound", sync=False)
def __init__(self, *pargs, **kwargs):
- if 'value' in kwargs and ('lower' in kwargs or 'upper' in kwargs):
- raise ValueError("Cannot specify both 'value' and 'lower'/'upper' for range widget")
-
value_given = 'value' in kwargs
+ lower_given = 'lower' in kwargs
+ upper_given = 'upper' in kwargs
+ if value_given and (lower_given or upper_given):
+ raise ValueError("Cannot specify both 'value' and 'lower'/'upper' for range widget")
+ if lower_given != upper_given:
+ raise ValueError("Must specify both 'lower' and 'upper' for range widget")
DOMWidget.__init__(self, *pargs, **kwargs)
@@ -104,15 +107,11 @@ class _BoundedFloatRange(_FloatRange):
if self.min > self.max:
raise ValueError("min must be <= max")
- # ensure the initial values within bounds
- if self.lower < self.min:
- self.lower = self.min
-
- if self.upper > self.max:
- self.upper = self.max
-
- # if no value is set, use 25-75% to avoid the handles overlapping
- if not any_value_given:
+ if any_value_given:
+ # if a value was given, clamp it within (min, max)
+ self._validate("value", None, self.value)
+ else:
+ # otherwise, set it to 25-75% to avoid the handles overlapping
self.value = (0.75*self.min + 0.25*self.max,
0.25*self.min + 0.75*self.max)
# callback already set for 'value', 'lower', 'upper'
diff --git a/IPython/html/widgets/widget_int.py b/IPython/html/widgets/widget_int.py
index 538d2f7a6..577728791 100644
--- a/IPython/html/widgets/widget_int.py
+++ b/IPython/html/widgets/widget_int.py
@@ -74,10 +74,13 @@ class _IntRange(_Int):
upper = CInt(1, help="Upper bound", sync=False)
def __init__(self, *pargs, **kwargs):
- if 'value' in kwargs and ('lower' in kwargs or 'upper' in kwargs):
- raise ValueError("Cannot specify both 'value' and 'lower'/'upper' for range widget")
-
value_given = 'value' in kwargs
+ lower_given = 'lower' in kwargs
+ upper_given = 'upper' in kwargs
+ if value_given and (lower_given or upper_given):
+ raise ValueError("Cannot specify both 'value' and 'lower'/'upper' for range widget")
+ if lower_given != upper_given:
+ raise ValueError("Must specify both 'lower' and 'upper' for range widget")
DOMWidget.__init__(self, *pargs, **kwargs)
@@ -110,15 +113,11 @@ class _BoundedIntRange(_IntRange):
if self.min > self.max:
raise ValueError("min must be <= max")
- # ensure the initial values within bounds
- if self.lower < self.min:
- self.lower = self.min
-
- if self.upper > self.max:
- self.upper = self.max
-
- # if no value (or upper/lower) is set, use 25-75% to avoid the handles overlapping
- if not any_value_given:
+ if any_value_given:
+ # if a value was given, clamp it within (min, max)
+ self._validate("value", None, self.value)
+ else:
+ # otherwise, set it to 25-75% to avoid the handles overlapping
self.value = (0.75*self.min + 0.25*self.max,
0.25*self.min + 0.75*self.max)
# callback already set for 'value', 'lower', 'upper'