我正在尝试编写一个函数来打开从子菜单中选择的最近文件,但是当我遍历最近的文件时,最后一个文件是唯一被识别的文件。
以下是用于说明问题的示例代码:
from Tkinter import *
class App(Frame):
def __init__(self, root):
Frame.__init__(self, root)
menubar = Menu(self, tearoff=0)
fileMenu = Menu(self, tearoff=0)
recentMenu = Menu(self, tearoff=0)
menubar.add_cascade(label="File", menu=fileMenu)
fileMenu.add_cascade(label="Open Recent", menu=recentMenu)
for name in ('file1.txt', 'file2.txt', 'file3.txt'):
recentMenu.add_command(label=name, command=lambda: self.load_file(name))
root.configure(menu=menubar)
root.geometry("200x200")
def load_file(self, f):
print f
if __name__ == "__main__":
root = Tk()
App(root).pack(fill="both", expand=True)
root.mainloop()
例如,当我点击file2.txt时,程序会输出file3.txt。我确定我错过了一些微不足道的东西,但我无法弄清楚那是什么。
答案 0 :(得分:1)
以下作品:
...
for name in ('file1.txt', 'file2.txt', 'file3.txt'):
recentMenu.add_command(label=name, command=self.load_file(name))
...
def load_file(self, f):
def fun():
print f
return fun
在您的版本中,此时,当您调用回调函数时,name
引用实例file3.txt
。在我的版本中,实例file1.txt
,file2,txt
等等被捕获在闭包内(不是严格意义上的闭包,但非常相似)。
请参阅SO中的closures。