Shared script to createPopupMenu

Hi Guys,

If I do something like this on a components mouseReleased event handler I get what I expect (a popup menu when the component is right clicked):

def function1():
pass

def rightClickPopup(component):
menu = system.gui.createPopupMenu(["Item1"], [function1])
menu.show(event)

rightClickPopup(event.source)

I would like to move this to a shared script named myfuncs:

def function1():
pass

def rightClickPopup(component):
menu = system.gui.createPopupMenu(["Item1"], [function1])
menu.show(event)

When a call the function on a mouseReleased event handler on a component like this:

shared.myfuncs.rightClickPopup(event.source)

I get this error:

Traceback (most recent call last):

File "event:mouseReleased", line 1, in

File "module:shared.myfuncs", line 19, in rightClickPopup

NameError: global name 'event' is not defined

Ignition v7.9.9 (b2018081621)
Java: Oracle Corporation 1.8.0_171

Any help would be much appreciated.

The working examples are taking advantage of jython’s closures – variables in an outer scope referenced by inner scopes are captured at definition time. No event objects or anything else defined in an event or custom method exist in a project script’s scope. You will need to pass the event as an argument to your project script.

Thanks Phil. Another quick question - can I pass other arguments to the createPopupMenu functions?

No, you cannot. If you’re working with popup menus, functools.partial is your friend.

Hi Paul, thanks for the spark! For anyone wanting an example to pass more arguments to createPopupMenu:

from functools import partial

def function(x, event):
print x

y = 1
function_partial = partial(function, y)
menu = system.gui.createPopupMenu(["text"], [function_partial])
menu.show(event)