#!/python22/bin/python import types class Var(object): DEFAULT_VALUE = None BASETYPE = str def __init__(self, value=None, *variables): # create all private variables self._value = self.DEFAULT_VALUE self.variables = variables self._change_callbacks = [] # init variables self.value = value def _call_change_callbacks(self, old, new): for callback in self._change_callbacks: callback(self, old, new) def bind(self, callback): self._change_callbacks.append(callback) def unbind(self, callback, secure=False): try: self._change_callbacks.remove(callback) return True except ValueError: if secure: return False else: raise def __add__(self, other): return self.value + other def __sub__(self, other): return self.value - other def __mul__(self, other): return self.value * other def __div__(self, other): return self.value / other def __mod__(self, other): return self.value % other def __radd__(self, other): return other + self.value def __rsub__(self, other): return other - self.value def __rmul__(self, other): return other * self.value def __rdiv__(self, other): return other /self.value def __rmod__(self, other): return other % self.value def _set(self, value): _old = self._value self._value = value self._call_change_callbacks(_old, value) def _get(self): if self.variables: return self._value % self.variables else: return self._value def _del(self): self._value = self.DEFAULT_VALUE def __repr__(self): return " value=%s" % ( repr(self.__class__)[1:-1], repr(self._value) ) def __call__(self, *arg): if arg: self.value = arg[0] else: return self.value def __str__(self): if self.variables: return str(self._value) % self.variables else: return str(self._value) def __int__(self): return int(self._value) def __float__(self): return float(self._value) def __bool__(self): return self.__nonzero__() def __nonzero__(self): if self._value: return True else: return False value = property(_get, _set, _del) class StringVar(Var): DEFAULT_VALUE = "" BASETYPE = str def __init__(self, value=None, *variables): Var.__init__(self, value or self.DEFAULT_VALUE, *variables) def _set(self, value): if isinstance(value, (str, unicode, self.__class__)): Var._set(self, value) else: raise TypeError, \ "Type must be string, unicode or StringVar, found %s instead." % str(type(value)) return value = property(Var._get, _set, Var._del) class IntVar(Var): DEFAULT_VALUE = 0 BASETYPE = int def __init__(self, value=None): Var.__init__(self, value or self.DEFAULT_VALUE) def _set(self, value): if isinstance(value, (int, long, self.__class__)): Var._set(self, value) else: raise TypeError, \ "Type must be int, long or IntVar, found %s instead." % str(type(value)) value = property(Var._get, _set, Var._del) class FloatVar(Var): DEFAULT_VALUE = 0.0 BASETYPE = float def __init__(self, value=None): Var.__init__(self, value or self.DEFAULT_VALUE) def _set(self, value): if isinstance(value, (float, self.__class__)): self._value = value elif isinstance(value, (int, long)): self._value = float(value) else: raise TypeError, \ "Type must be float, int or long, found %s instead." % str(type(value)) value = property(Var._get, _set, Var._del) class BoolVar(Var): DEFAULT_VALUE = False BASETYPE = bool def __init__(self, value=None): Var.__init__(self, value or self.DEFAULT_VALUE) def _set(self, value): self._value = bool(value) value = property(Var._get, _set, Var._del) def out(var, old, new): print "Wert von", var.__class__, "aenderte sich von", old, "zu", new