0

In my application, I have a list of apps,

apps = [
    App("app1", "username1", "password1", "----"),
    App("app2", "username2", "password2", "----"),
    App("app3", "username3", "password3", "----"),
]

(App() is simply a class that contains data for each app)

Later in the code, I loop over this array to create a label widget for each app.

appLabels = []

for a in apps:
    lbl = ptg.Label(a.name)
    def left_mouse():
        showEditForm(a)
    lbl.on_left_click = lambda _: left_mouse()
    appLabels.append(lbl)

However, when i click on any of the labels, it always calls showEditForm() with app3. How can I create a unique event handler for each app that will call showEditForm() with the right app?

1 Answer 1

1

When you iterate over a list, the function left_mouse will be re-defined each time, and the lambda will refer to the latest one, in your case, the third one, and the a variable in the function will also be the last one. To solve the issue, consider adding a parameter with a default unique value (maybe a in your case) to the lambda and left_mouse functions. The code will like this:

appLabels = []

def left_mouse(app):
    showEditForm(app)

for a in apps:
    lbl = ptg.Label(a.name)
    lbl.on_left_click = lambda _, app=a: left_mouse(app)
    appLabels.append(lbl)

Not the answer you're looking for? Browse other questions tagged or ask your own question.