Ваша проблема в том, что вы создаете множество lambda
объектов в одном и том же пространстве имен, и эти lambda
ссылаются на имена во внешней области видимости.Это означает, что они не становятся замыканиями и не хранят ссылки на объекты до тех пор, пока позже ... Когда это произойдет, все лямбды будут ссылаться на последнее значение i
.
Попробуйте использовать обратный вызовЧтобы исправить это:
import Tkinter as tk
def callbackFactory(b, n):
def _callback():
return b.playColumn(n, b.getCurrentPlayer())
return _callback
for i in range(boardWidth):
newButton = tk.Button(root, text=str(i+1),
command=callbackFactory(Board, i+1))
Board.boardButtons.append(newButton)
Другая идея заключается в том, чтобы сохранить текущее значение i как значение аргумента по умолчанию в объекте lambda
, вместо того чтобы полагаться на поведение замыкания для хранения ссылки:
for i in range(boardWidth):
newButton = tk.Button(root, text=str(i+1),
command=lambda x=i: Board.playColumn(x+1, Board.getCurrentPlayer()))
Board.boardButtons.append(newButton)