Python - tkinter - 按钮 - 错误命令 - 出了什么问题?

问题描述 投票:0回答:1

我正在用 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)

Stack chosing

Chosing amount of stones to take

我尝试这样做,但还是不行

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)

如果我的英语不是很好,我很抱歉

python tkinter button nim-game
1个回答
0
投票

看来您对

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)
© www.soinside.com 2019 - 2024. All rights reserved.