我正在用 Python 创建一个名为 NIM 的游戏
stack = heap
这是我之前的代码,具有固定数量的堆栈(堆),一切正常
class Game:
def __init__(self):
self.pack_kwargs = {'fill' : BOTH, 'expand' : True, 'padx' : ['0', '0'], 'pady' : ['0', '0']}
def player1(self):
def chooseStack(stack):
self.stack = stack
window_player1_stack.destroy()
btn1 = Button(window_player1_stack, text = '1', bd = '2', command = lambda: chooseStack(0))
btn2 = Button(window_player1_stack, text = '2', bd = '2', command = lambda: chooseStack(1))
btn3 = Button(window_player1_stack, text = '3', bd = '2', command = lambda: chooseStack(2))
if self.stacks[0]: btn1.pack(**self.pack_kwargs)
if self.stacks[1]: btn2.pack(**self.pack_kwargs)
if self.stacks[2]: btn3.pack(**self.pack_kwargs)
但我想让它可以玩任意数量的堆栈(而不是固定的),但它不起作用 - 它总是选择最后一个堆栈,而不是我选择的堆栈
for i in range(len(self.stacks)):
Button(window_player1_stack, text = f'{i+1}', bd = '2', command = lambda: chooseStack(i)).pack(**self.pack_kwargs)
我尝试这样做,但还是不行
buttons = []
for i in range(len(self.stacks)):
button = Button(window_player1_stack, text = f'{i+1}', bd = '2', command = lambda: chooseStack(i))
buttons.append(button)
if self.stacks[0]: buttons[0].pack(**self.pack_kwargs)
if self.stacks[1]: buttons[1].pack(**self.pack_kwargs)
if self.stacks[2]: buttons[2].pack(**self.pack_kwargs)
如果我的英语不是很好,我很抱歉
看来您对
lambda
中的loop
有常见问题。
它不会将值从
i
发送到 lambda
,而仅引用变量 i
i
获取值
但此时变量 i
具有来自 for
循环的最后一个值 - 因此所有按钮都从 i
获得相同的值。lambda x=i: chooseStack(x)...
将值复制到另一个变量。
for i in range(len(self.stacks)):
button = Button(window_player1_stack, text=f'{i+1}', bd='2',
command=lambda x=i: chooseStack(x))
buttons.append(button)