1.6 KiB
The jython/test/Python3Test.py3 provides some examples of these.
You can access jmri.Turnout.CLOSED but jmri.Turnout.UNKNOWN is undefined. You have to access jmri.NamedBean.UNKNOWN instead, which is a real pain.
The Jython property wrapper syntax that makes the next two lines the same is not available:
turnout.state
turnout.getState()
Some Java super-class methods of a Python class need to be called via e.g.
self.__super__.waitMsec(1000)
But others don’t, and it’s not clear why.
Referencing Python local variables in a Java-based object requires .this. syntax:
m = MyListener()
#
# invoked the listener, which sets 'internalVariable'
#
m.this.internalVariable
We can't yet put JMRI symbols into the Python context, so you have to run
exec(open("jython/jmri_bindings.py3").read())
at the start of each script. This provides definitions for the usual symbols: ON, OFF, ACTIVE, turnouts, sensors etc.
Referencing a class type needs a java.type wrapper:
sm = jmri.InstanceManager.getNullableDefault(java.type('jmri.SensorManager'))
We've put a helper method in place for that specific case
sm = jmri.InstanceManager.getNullableDefault('jmri.SensorManager')
but you may need the java.type('jmri.SensorManager') syntax in other places.
The debugging support is terrible: Syntax errors generate opaque error messages that don’t point to the relevant line in the script.
AbstractAutomaton subclasses occasionally cause the whole of JMRI to stop with a thread deadlock. Not understood why the GraalVM Python interpreter is occasionally taking a lock on the Swing/AWT thread.