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

2024-10-02 10:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的代码中,我创建了一系列按钮,以便在创建的number类上运行increase或decrease方法。你知道吗

    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())

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

\u priceNums是与\u adjustedPrice中number对象的值相对应的StringVars列表

谢谢你!你知道吗


Tags: 对象方法selfnumber列表columnbuttonwindow
1条回答
网友
1楼 · 发布于 2024-10-02 10:24:02

您需要将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

相关问题 更多 >

    热门问题