将函数绑定到在tkinter的循环中创建的按钮

时间:2017-03-21 17:17:33

标签: python excel tkinter

我写了一个for循环来根据excel工作簿中的工作表数创建按钮。但是,我有很难的装订功能,可以在每张纸上打印数据。有人可以帮忙吗?谢谢。 这就是我所做的事情

wb = xlrd.open_workbook('file_path.xlsx')
        sheetnames = wb.sheet_names()
        num_sheets = len(sheetnames)

        def load_sheet():
        for d in range(0, num_sheets):
            print(sheetnames[d])

        for i in range(0, num_sheets):
            an_sheet = ttk.Button(self, text = "%s" % sheetnames[i], 
                                  command= lambda : load_data)
            an_sheet.grid(row = 1, column = i+1, sticky='w', pady = 10, padx = 10)

1 个答案:

答案 0 :(得分:1)

如果你在for循环中使用lambda,这是一个常见的初学者问题,因为初学者不会意识到lambda是后期绑定的。换句话说,它总是使用" i"的最后一个值,而不是" i"的值。设置命令参数时。在这种情况下,您需要使用functools.partial代替:

from functools import partial
# ...
for i in range(0, num_sheets):
    an_sheet = ttk.Button(self, text = "%s" % sheetnames[i], command=partial(function, i))
    an_sheet.grid(row = 1, column = i+1, sticky='w', pady = 10, padx = 10)