创造许多独特的事件

时间:2012-10-18 18:23:57

标签: python python-2.7 tkinter unique

我正在编写一个包含很多按钮(超过100个)的程序,每个按钮都需要一个独特的结果,但所有结果都相似,这是第一个按钮的代码

box1= 'filepath to text file'
def openfile(filename):
    filetxt = (open(filename,"r").read())
    return filetxt
    var.set(filetxt)

def Box1():
    var.set(openfile(box1))

openfile(box1)
window1 = Tk()
window1.geometry('450x450')

var = StringVar()

Button1 = Button(donut,text = "Box #1", command= Box1 )
Button1.pack()

每个按钮都会做同样的事情,但访问一个不同的文件,有没有比只为每个按钮编写一个唯一的回调函数更有效的方法呢?

2 个答案:

答案 0 :(得分:2)

通常,您将列表中的文件:

list_of_files = ...

然后你会创建一个函数来创建一个打开文件输入的按钮:

def file_open_button(filename):
    b = Button(donut, text = 'open {0}'.format(filename), command = lambda: openfile(filename))
    return b

现在迭代你的文件列表并创建按钮,随时打包:

for f in list_of_files:
    button = file_open_button(f)
    button.pack()

也许您缺少的是对lambda(匿名)函数的理解。 lambda函数很像常规函数:

def foo(x):
    return x*x

bar = lambda x: x*x

以上陈述非常相似。例如foo(x) == bar(x)始终为True

答案 1 :(得分:2)

您的所有按钮都可以共享一个回调。您可以使用lambda将文件名传递给回调。例如:

path="/path/to/the/file"
b = Button(..., command=lambda f=path: openfile(f))

另一种选择是使用functools.partial。有些人认为这比lambda更具可读性:

b = Button(..., command=functools.partial(openfile, path))