TKinter使用索引for循环传递按钮命令的参数

时间:2016-12-03 22:42:19

标签: python for-loop button indexing tkinter

我有以下代码片段,其中我创建了一系列按钮来对创建的数字类运行增加或减少方法。

    for idx in range(len(self._priceNums)):
        Button(window, text='^', command=lambda: self.incNum(idx)).grid(row=0, column=numInColumn)
        Label(window, textvariable=self._priceNums[idx]).grid(row=1, column=numInColumn)
        Button(window, text='v', command=lambda: self.decNum(idx)).grid(row=2, column=numInColumn)
        numInColumn += 1

该功能在列表中的选定对象上按预期工作,但我的问题是让按钮操作正确的对象。

lamba: self.incNum(idx)

似乎只在按下按钮时读取idx。因此,每个按钮仅在列表中的最后一个对象上运行方法。有没有办法以这种方式创建一系列按钮,每个按钮对应于此列表中的相应数字对象。这是参考方法

def incNum(self, idx):
    self._priceNums[idx].set(self.game._adjustedPrice[idx].incNum())

请注意,可能有用也可能没有帮助:

_priceNums是一个StringVars列表,对应于_adjustedPrice中数字对象的值

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要将idx变量传递给lambda函数。

for idx in range(len(self._priceNums)):
    Button(window, text='^', command=lambda idx=idx: self.incNum(idx)).grid(row=0, column=numInColumn)
    Label(window, textvariable=self._priceNums[lambda idx=idx: idx]).grid(row=1, column=numInColumn)
    Button(window, text='v', command=lambda idx=idx: self.decNum(idx)).grid(row=2, column=numInColumn)
    numInColumn += 1