1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# class myvar for jlg_47
# http://www.developpez.net/forums/d915461/autres-langages/python-zope/general-python/crash-aleatoire-thread/
# Based on Tkinter variable class
class myvar:
_default = ""
def __init__(self, master=None, value=None, name=None, trace=None, mode=None, visible=None):
if not master:
master = self
self._master = master
if name:
self._name = name
else:
self._name = None
if value is not None:
self._value=value
else:
self._value=self._default
if trace:
self._trace=trace
else:
self._trace=None
if mode:
self._mode=mode
else:
self._mode=None
self._oldmode=None
self._oldtrace=None
def __str__(self):
return str(self._name)
def set(self, value):
self._value=value
if self._trace is not None and (self._mode == 'u' or self._mode == 'w'):
self.savetrace()
self._oldtrace()
elif self._oldtrace is not None:
self.restauretrace()
def get(self):
if self._trace is not None and (self._mode == 'u' or self._mode == 'r'):
self.savetrace()
self._oldtrace()
elif self._oldtrace is not None:
self.restauretrace()
return self._value
def trace_variable(self, mode, callback):
self._mode=mode
self._trace=callback
trace = trace_variable
def trace_vdelete(self):
self._mode=None
self._trace=None
def trace_vinfo(self):
return self._mode, self._trace
def varinfo(self):
return "Master", self._master, "Name", self._name, "Value", str(self._value), "Trace callback", self._trace, "Trace mode", self._mode
# TODO For callback recursion
def restauretrace(self):
self._trace=self._oldtrace
self._mode=self._oldmode
self._oldtrace=None
self._oldmode=None
def savetrace(self):
self._oldtrace=self._trace
self._oldmode=self._mode
self._trace=None
self._mode=None
if __name__ == "__main__":
a=myvar()
# Default value = ""
print a.get()
# Set a value
a.set(10)
# Get the value
print a.get()
# trace value
def callback():
# Please, don't use multiples get()/set() whith callback
print 'a in callback', a.get()
# a.set(30)
a.trace('u', callback)
a.set(20)
print 'a after callback'
print a.get()
# Callback informations
print 'Callback informations', a.trace_vinfo()
# Name
b=myvar(name='b')
print 'b name', b
# Variable informations
print 'Variable informations'
dir(b)
print b.varinfo()
# Delete callback
a.trace_vdelete()
print a.trace_vinfo() |
Partager