哪个动态创建的对象称为函数?

时间:2015-06-05 10:38:07

标签: python lambda tkinter

我正在制作一个带有Tkinter GUI的python应用程序。到目前为止,它有一些动态创建的列表框,我将链接到一个滚动条。我需要一种方法让yscroll()知道哪个列表框已滚动。将i变量传递给yscroll()不起作用。

from Tkinter import *

class MyApp(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.title(' - My App - ')

        self.listboxes = []
        for i in xrange(5):
            lb = Listbox(self, yscrollcommand=lambda i, *args: self.yscroll(i, *args))
            for x in xrange(30):
                lb.insert('end', x)

            lb.pack(fill='y', side='left')
            self.listboxes.append( lb )

        self.scrollbar = Scrollbar(self, orient='vertical')
        self.scrollbar.pack(side='right', fill='y')

    def yscroll(self, i, *args):
        print i
        print args

ma = MyApp()
ma.mainloop()

1 个答案:

答案 0 :(得分:2)

usual recipe for using a variable from a loop in a lambda似乎与参数解包与*args一起使用时无法正常工作。但由于*args在这种情况下似乎总是包含两个值(视口的开头和结尾,除非我误认为),你可以像这样重写lambda

lb = Listbox(self, yscrollcommand = lambda x, y, i=i: self.yscroll(i, x, y))

或者您可以创建一种" meta lambda",创建一个具有i正确值的lambda

make_callback = lambda i: lambda *args: self.yscroll(i, *args)
lb = Listbox(self, yscrollcommand = make_callback(i))

当定义i时,两者都会将i绑定到迭代中lambda的值。