X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=Ihm%2FCONNECTOR.py;h=45c099217e1cc9a19bf393dae857b0aefd019d4d;hb=9f4ff7ed9afd87c96e11d61e442e39e5511f60d1;hp=429501dd008717d4ee73e374f14a3fbb8c25c504;hpb=16d5922e798b1254eb558678612711d72ed38b32;p=tools%2Feficas.git diff --git a/Ihm/CONNECTOR.py b/Ihm/CONNECTOR.py index 429501dd..45c09921 100644 --- a/Ihm/CONNECTOR.py +++ b/Ihm/CONNECTOR.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +#i -*- coding: utf-8 -*- # Copyright (C) 2007-2013 EDF R&D # # This library is free software; you can redistribute it and/or @@ -34,12 +34,12 @@ listener(cargs+args) """ +from __future__ import absolute_import +from __future__ import print_function import traceback from copy import copy import weakref -from Extensions.i18n import tr -from Extensions.eficas_exception import EficasException class ConnectorError(Exception): pass @@ -50,14 +50,16 @@ class CONNECTOR: self.connections={} def Connect(self, object, channel, function, args): - ###print "Connect",object, channel, function, args + #print ("Connect",object, channel, function, args) idx = id(object) - if self.connections.has_key(idx): + #if self.connections.has_key(idx): + if idx in self.connections : channels = self.connections[idx] else: channels = self.connections[idx] = {} - if channels.has_key(channel): + #if channels.has_key(channel): + if channel in channels : receivers = channels[channel] else: receivers = channels[channel] = [] @@ -69,15 +71,14 @@ class CONNECTOR: receivers.remove((funct,fargs)) receivers.append((ref(function),args)) - ###print "Connect",receivers def Disconnect(self, object, channel, function, args): try: receivers = self.connections[id(object)][channel] except KeyError: - raise ConnectorError, \ - 'no receivers for channel %s of %s' % (channel, object) + raise ConnectorError ( + 'no receivers for channel %s of %s' % (channel, object)) for funct,fargs in receivers[:]: if funct() is None: @@ -95,9 +96,9 @@ class CONNECTOR: del self.connections[id(object)] return - raise ConnectorError,\ + raise ConnectorError( 'receiver %s%s is not connected to channel %s of %s' \ - % (function, args, channel, object) + % (function, args, channel, object)) @@ -107,14 +108,18 @@ class CONNECTOR: receivers = self.connections[id(object)][channel] except KeyError: return - ###print "Emit",object, channel, receivers + #print "Emit",object, channel, receivers # Attention : copie pour eviter les pbs lies aux deconnexion reconnexion # pendant l'execution des emit for rfunc, fargs in copy(receivers): try: func=rfunc() if func: - apply(func, args + fargs) + #print (func,args,fargs) + #rint args + fargs + #apply(func, args + fargs) + if args + fargs == () : func() + else : func ( args + fargs) else: # Le receveur a disparu if (rfunc,fargs) in receivers:receivers.remove((rfunc,fargs)) @@ -122,15 +127,19 @@ class CONNECTOR: traceback.print_exc() def ref(target,callback=None): - if hasattr(target,"im_self"): + #if hasattr(target,"im_self"): + # return BoundMethodWeakref(target) + if hasattr(target,"__self__"): return BoundMethodWeakref(target) else: return weakref.ref(target,callback) class BoundMethodWeakref(object): def __init__(self,callable): - self.Self=weakref.ref(callable.im_self) - self.Func=weakref.ref(callable.im_func) + #self.Self=weakref.ref(callable.im_self) + #self.Func=weakref.ref(callable.im_func) + self.Self=weakref.ref(callable.__self__) + self.Func=weakref.ref(callable.__func__) def __call__(self): target=self.Self() @@ -147,27 +156,35 @@ Disconnect = _the_connector.Disconnect if __name__ == "__main__": class A: pass + class B: def add(self,a): - print "add ", self , a + print(("--------------------------------add ", self , a)) + def __del__(self): - print "__del__", self + print(("__del__", self)) def f(a): - print f, a + print((f, a)) + a=A() b=B() c=B() + Connect(a,"add",b.add,()) Connect(a,"add",b.add,()) Connect(a,"add",c.add,()) Connect(a,"add",f,()) + Emit(a,"add",1) - print "del b" + + print ("del b") del b + Emit(a,"add",1) - print "del f" + print ("del f") del f + Emit(a,"add",1) Disconnect(a,"add",c.add,()) Emit(a,"add",1)