确定调用按钮列表共享的公共事件处理程序的按钮对象?

时间:2014-07-16 13:12:00

标签: python

如果我们在一个只有一个公共事件处理程序的程序中声明了一个按钮对象列表,那么我们如何确定哪个特定按钮正在调用该处理程序?

我的代码如下:

self.bttn = []
        for i in range(0, 10, 1):
            self.bttn.append(Button(self,
                                    text = str(i),
                                     command = self.callback).grid(row = 4, column = i + 1, sticky = E))

1 个答案:

答案 0 :(得分:0)

我喜欢将参数传递给按钮独有的回调。在这种情况下,您可以使用按钮的索引。 (尽管你必须小心地通过在lambda中的默认参数中使用它来调用“早期绑定”行为;否则i将始终具有i包含的最后一个值,而不是创建按钮时的值。)

for i in range(0, 10, 1):
    self.bttn.append(
        Button(
            self,
            text = str(i),
            command = lambda i=i: self.callback(i)
        ).grid(row = 4, column = i + 1, sticky = E)
    )

#later on in the class...    
def callback(self, idx):
    print "button #{} was clicked".format(idx)

顺便说一下,您的self.bttn列表只会包含None个值,因为NoneButton.grid()的结果。如果您希望self.bttn包含按钮,则​​必须创建按钮,将其添加到列表中,然后单独对其进行网格化。

for i in range(0, 10, 1):
    b = Button(
        self,
        text = str(i),
        command = lambda i=i: self.callback(i)
    )
    b.grid(row = 4, column = i + 1, sticky = E)
    self.bttn.append(b)