2014-05-12 60 views
1

我写过这个小程序。它从配置文件中读取几个文件名(主要是PDF),并为每个应使用默认应用程序打开文件的文件创建一个按钮。TkInter所有按钮打开同一个文件

问题是,所有按钮总是打开config.ini文件中的最后一个文件。这种行为告诉我for循环必须有问题,但我不知道如何解决它。

任何想法?

from tkinter import * 
import subprocess, os, sys 

def opendoc(file): 
    if sys.platform == 'linux': 
     subprocess.call(["xdg-open", file]) 
    else: 
     os.startfile(file) 

ini = open('config.ini') 
carray = [] 

for line in ini: 
    carray.append(line) 

for line in carray: 
    print(line) 

master = Tk() 

for i in carray: 
    Button(master, text=i, command=lambda: opendoc(i)).pack(anchor=W) 

mainloop() 
+0

因为在最后一次迭代中,'i'被设置为最终值,因此所有按钮都指向该值。 –

回答

2

也许尝试

from functools import partial 

并使用

Button(master, text=i, command=partial(opendoc, i)) 

局部对象是使用i的当前值创建,而拉姆达 使用参考变量i在附上范围,其价值可能发生变化。 或类似的东西。

我总是发现自己使用部分与tkinter。