import numtraits
from ipywidgets import widgets
from pint import UnitRegistry
import traitlets
from traitlets import link
ureg = UnitRegistry()
Q_ = ureg.Quantity
ureg.define('hogsheads = 238 * liters = hhd')
rphhd = ureg.rod / ureg.hogsheads
mpl = ureg.meter / ureg.liter
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
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
rphhdfs = RodsPerHogsheadFloatSlider(description="rods per hogshead")
rphhdfs.num_value = 40 * rphhd
mplfs = MetersPerLiterFloatSlider(description="meters per liter")
link((rphhdfs, "num_value"), (mplfs, "num_value"))
<traitlets.traitlets.link at 0x6dbfc50>
mplfs
rphhdfs
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
make_slider(rphhd)()