#!/python22/bin/python import types class Var(object): DEFAULT_VALUE = None def __init__(self, value=None): # create all private variables self._value = self.DEFAULT_VALUE 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 _set_value(self, value): _old = self._value self._value = value self._call_change_callbacks(_old, value) def _get_value(self): return self._value def _del_value(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): return str(self._value) def __int__(self): return int(self._value) def __float__(self): return float(self._value) value = property(_get_value, _set_value, _del_value) class StringVar(Var): DEFAULT_VALUE = "" def __init__(self, value=None): Var.__init__(self, value or self.DEFAULT_VALUE) def _set_value(self, value): if type(value) in (types.StringType, types.UnicodeType): Var._set_value(self, value) else: raise TypeError, \ "Type must be string or unicode, found %s instead." % str(type(value)) return value = property(Var._get_value, _set_value, Var._del_value) class IntVar(Var): DEFAULT_VALUE = 0 def __init__(self, value=None): Var.__init__(self, value or self.DEFAULT_VALUE) def _set_value(self, value): if type(value) in (types.IntType, types.LongType): Var._set_value(self, value) else: raise TypeError, \ "Type must be int or long, found %s instead." % str(type(value)) value = property(Var._get_value, _set_value, Var._del_value) class FloatVar(Var): DEFAULT_VALUE = 0.0 def __init__(self, value=None): Var.__init__(self, value or self.DEFAULT_VALUE) def _set_value(self, value): if type(value) is types.FloatType: self._value = value elif type(value) in (types.IntType, types.LongType): self._value = float(value) else: raise TypeError, \ "Type must be float, int or long, found %s instead." % str(type(value)) value = property(Var._get_value, _set_value, Var._del_value) def out(var, old, new): print "Wert von", var.__class__, "aenderte sich von", old, "zu", new