Roy_043 wrote: ↑Sun Nov 19, 2023 9:55 pm
Why is that?
As far as I can tell, the parameter group (variable "param") does not have to be global, but it has to be kept alive in memory.
As soon as "param" is destroyed by the garbage collector, the observer gets detached.
see
https://github.com/FreeCAD/FreeCAD/blob ... #L252-L260
You don't need a "global" keyword. Just assign "param" to something thas is kept in memory anyways.
Two examples that will work without the "global" keyword:
Code: Select all
class _ParamObserver:
def slotParamChanged(self, param, tp, name, value):
print("slotParamChanged")
print(param)
def _start_observer():
param = App.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft")
param.AttachManager(_ParamObserver())
return param
param = _start_observer() # keep "param" alive
Code: Select all
class _ParamObserver:
def slotParamChanged(self, param, tp, name, value):
print("slotParamChanged")
print(param)
def _start_observer(ll=[]):
param = App.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft")
param.AttachManager(_ParamObserver())
ll.append(param) # keep "param" alive
_start_observer()