如何循环数组并为每个项目创建唯一的事件处理程序

问题描述 投票:0回答:1

在我的应用程序中,我有一个应用程序列表,

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

(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)

但是,当我单击任何标签时,它总是用 app3 调用

showEditForm()
。如何为每个应用程序创建一个唯一的事件处理程序,以便使用正确的应用程序调用
showEditForm()

python loops events eventhandler
1个回答
0
投票

这是常见问题。当您迭代列表时,每次都会重新定义函数 left_mouse,并且 lambda 将引用最新的一个,在您的情况下是第三个。要解决此问题,请考虑向 lambda 和 left_mouse 函数添加一个具有默认唯一值的参数(在您的情况下可能是

a
),如以下更正后的代码所示:

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)
© www.soinside.com 2019 - 2024. All rights reserved.