2016-12-03 70 views
-1

我有以下一段代碼,我在其中創建一系列按鈕以在創建的數字類上運行增加或減少方法。按預期在列表中選定的對象,但我的問題越來越按鈕到正確的對象進行操作TKinter使用索引for循環來傳遞按鈕命令的參數

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

對象,謝謝!

回答

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