首页 > 解决方案 > 在循环命令中创建的 tkinter 按钮不起作用

问题描述

我正在尝试使用 tkinter 在 python 中重新创建扫雷,并且我正在使用 2d 列表创建我的网格。我必须使用lambda:来运行我的命令,因为它正在接受参数但是当我单击一个按钮时发生的事情是它正在打印最后一个按钮的位置,例如,如果网格是 9x9,它将打印 8 8。

def play():
    global game
    game = tk.Toplevel(root)
    game.title("Minesweeper")
    grid = [[tk.Button(game, text = "", command = lambda: show(i, j), width = 4, height = 2) for j in range(cols)] for i in range(rows)]
    [[grid[i][j].grid(row = i, column = j) for j in range(cols)] for i in range(rows)]

def show(i, j):
    print(i, j)

有谁知道我该如何解决这个问题?

标签: pythonpython-3.xtkinter

解决方案


将 lambda 更改为: lambda i=i, j=j: show(i, j)

这将在创建 lambda 时捕获 i 和 j 的值。相反,它正在 lambda 的范围内查找 i 和 j,但是在单击按钮时,列表理解中的循环完成并且 i 和 j 都是 8。


推荐阅读