So I've been writing this application that works with files , and I wanted to add a list of recently opened files in the "File" menu and I came across a weird bug ..

Here's the sample code ..

for path in recentFilesList:
    item = wx.MenuItem(menu, wx.NewId(), path)
    self.Bind(wx.EVT_MENU, lambda(event):self.LoadRecent(path), item)
    menu.AppendItem(item()

so the problem is that the last lambda function gets bound to ALL the items added this way ..

so for instance , if

recentFileList[-1] = "C:\Last\File\Path"

clicking on any of those items

self.LoadRecent("C:\Last\File\Path"")

gets called ..

Am I missing something , or is this just a bug ?

it is not a bug. Your trouble is that in the scope of of your lambda function, path is a global variable, and by the end of the loop and forever more
path == recentFileList[-1]
Thus everytime one of your lambda functions is called it uses that value in loadRecent(...)

To come about it, you need to assign the value of path to a local variable (ie. local to your lambda function), and use that variable to call loadRecent:

lambda event,p=path: self.loadRecent(p)

you may name the local variable "path" also if you desire, but I have named it "p" for clarity, thus

lambda event,path=path: self.loadRecent(path)

is quite valid too.

Cheers!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.