在Python中使用lambda的tkinter按钮命令

vap*_*vap 8 python lambda tkinter list python-3.x

香港专业教育学院尝试寻找解决方案,但找不到一个有效.我有一个2d的tkinter按钮列表,我想在鼠标点击时更改它们的文本.我试过这样做:

def create_board(number):
    print(number)
    for i in range (0,number):
        buttonList.append([])
        for j in range(0,number):
            print(i,j)
            buttonList[i].append(Button(root, text = " ", command = lambda: update_binary_text(i,j)))
            buttonList[i][j].pack()
Run Code Online (Sandbox Code Playgroud)

然后单击它时调用此函数:

def update_binary_text(first,second):
    print(first,second)
    buttonList[first][second]["text"] = "1"
Run Code Online (Sandbox Code Playgroud)

当我点击一个按钮时,它什么都不做,我让程序显示被点击的按钮的索引,并且它们全部显示4,4(这是变量编号= 5时)是否有解决方案?
这是我第一次上课的python尝试.

谢谢

Joe*_*ett 10

您可以通过创建一个封闭解决这个问题i,并j与创建每个拉姆达:

command = lambda i=i, j=j: update_binary_text(i, j)
Run Code Online (Sandbox Code Playgroud)

您还可以创建一个回调工厂,其中包含对按钮对象本身的引用:

def callback_factory(button):
    return lambda: button["text"] = "1"
Run Code Online (Sandbox Code Playgroud)

然后在您的初始化代码中:

for j in range(0, number):
    new_button = Button(root, text=" ")
    new_button.configure(command=callback_factory(new_button))
    new_button.pack()
    buttonList.append(new_button)
Run Code Online (Sandbox Code Playgroud)