Tkinter - 如何打开最近的文件?

时间:2014-02-23 02:23:26

标签: python tkinter submenu

我正在尝试编写一个函数来打开从子菜单中选择的最近文件,但是当我遍历最近的文件时,最后一个文件是唯一被识别的文件。

以下是用于说明问题的示例代码:

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。我确定我错过了一些微不足道的东西,但我无法弄清楚那是什么。

1 个答案:

答案 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.txtfile2,txt等等被捕获在闭包内(不是严格意义上的闭包,但非常相似)。

请参阅SO中的closures