from PyQt5 import QtWidgets
from ... import format,limit
[docs]class LVNumLabel(QtWidgets.QLabel):
"""
Labview-style numerical label.
Supports different number representations and metric perfixes.
"""
def __init__(self, parent, value=None, num_limit=None, num_format=None, allow_text=True):
QtWidgets.QLineEdit.__init__(self, parent)
self.num_limit=limit.as_limiter(num_limit) if num_limit is not None else limit.NumberLimit()
self.num_format=format.as_formatter(num_format) if num_format is not None else format.FloatFormatter()
self._value=None
self.allow_text=allow_text
if value is not None:
self.set_value(value)
[docs] def change_limiter(self, limiter):
"""Change current numerical limiter"""
self.num_limit=limit.as_limiter(limiter)
self.set_value(self._value)
[docs] def set_number_limit(self, lower_limit=None, upper_limit=None, action="ignore", value_type=None):
"""
Set number limit.
`lower_limit` and `upper_limit` set the value limits (``None`` means no limit).
`action` specifies the action on out-of-limit: either ``"ignore"`` (return to the previously stored value), or ``"coerce"`` (coerce to the closest limit)
`value_type` can be either ``"float"`` (any floating point number is accepted), or ``"int"`` (round to the nearest integer).
"""
limiter=limit.NumberLimit(lower_limit=lower_limit,upper_limit=upper_limit,action=action,value_type=value_type)
self.change_limiter(limiter)
[docs] def repr_value(self, value):
"""Return representation of `value` according to the current numerical format"""
return self.num_format(value)
[docs] def get_value(self):
"""Get current numerical value"""
return self._value
[docs] def set_value(self, value):
"""Set and display current numerical value"""
if value is not None:
try:
if isinstance(value,str):
if self.allow_text:
self._value=value
self.setText(self._value)
else:
raise ValueError("this label doesn't accept text values")
else:
value=self.num_limit(value)
self._value=value
self.setText(self.num_format(self._value))
return True
except limit.LimitError:
pass
if self._value is not None:
self.setText(self.num_format(self._value))
return False