#!/usr/bin/env python # coding: utf-8 # ![](https://i.warosu.org/data/sci/img/0072/12/1429803412520.jpg) # In[7]: import numtraits from ipywidgets import widgets from pint import UnitRegistry import traitlets from traitlets import link ureg = UnitRegistry() # In[8]: Q_ = ureg.Quantity ureg.define('hogsheads = 238 * liters = hhd') rphhd = ureg.rod / ureg.hogsheads mpl = ureg.meter / ureg.liter # In[9]: class RodsPerHogsheadFloatSlider(widgets.FloatSlider): num_value = numtraits.NumericalTrait(convertible_to=rphhd) def _value_changed(self, old, new): self.num_value = new * rphhd def _num_value_changed(self, old, new): self.value = new / rphhd # In[17]: class MetersPerLiterFloatSlider(widgets.FloatSlider): num_value = numtraits.NumericalTrait(convertible_to=mpl) def _value_changed(self, old, new): self.num_value = new * mpl def _num_value_changed(self, old, new): self.value = new / mpl # In[11]: rphhdfs = RodsPerHogsheadFloatSlider(description="rods per hogshead") rphhdfs.num_value = 40 * rphhd # In[12]: mplfs = MetersPerLiterFloatSlider(description="meters per liter") # In[13]: link((rphhdfs, "num_value"), (mplfs, "num_value")) # In[14]: mplfs # In[15]: rphhdfs # In[26]: def make_slider(unit): class AutoUnitSlider(widgets.FloatSlider): description = traitlets.Unicode(str(unit.units), sync=True) num_value = numtraits.NumericalTrait(convertible_to=unit) def _value_changed(self, old, new): self.num_value = new * unit def _num_value_changed(self, old, new): self.value = new / unit return AutoUnitSlider # In[27]: make_slider(rphhd)()