如何正确绑定 wx.MenuItems 未存储在变量中

How to Correctly Bind wx.MenuItems not stored in a variable

前提:

我正在创建一个小 wx.Frame,如果我有一个 wx.SubMenu,可变数量 wx.MenuItems,我想将它们绑定到一个方法,所以我使用了这个代码:

self.selectworkout = wx.Menu()
self.x = 110
y = []
for elem in self.workout_list:
    y.append(self.selectworkout.Append(int(self.x), elem.title, elem.title + " | " + elem.description))
    index = self.workout_list.index(elem)
    self.Bind(wx.EVT_MENU, lambda event: self.OnSelectWorkout(event, elem), y[index])
    self.x+=1

为了获得指向 wx.MenuItems 的指针,我将它们存储在一个列表中,然后使用对应的列表项绑定它们

问题:

问题是,当我点击它们时,调用了方法,但它们传递了相同的参数,就像我绑定了相同的 wx.MenuItem

问题:

你知道问题出在哪里吗?或者什么是做我需要的最佳方法?

的问题
self.Bind(wx.EVT_MENU, lambda event: self.OnSelectWorkout(event, elem), y[index])

lambda表达式中的elem实际上是来自周围函数的变量。如果它被 for 循环更改,它会为所有创建的 lambda 更改。

简单的解决方案:将其更改为:

self.Bind(wx.EVT_MENU, lambda event, elem=elem: self.OnSelectWorkout(event, elem), y[index])