python - 在循环命令中创建的 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)
有谁知道我该如何解决这个问题?
解决方案
将 lambda 更改为:
lambda i=i, j=j: show(i, j)
这将在创建 lambda 时捕获 i 和 j 的值。相反,它正在 lambda 的范围内查找 i 和 j,但是在单击按钮时,列表理解中的循环完成并且 i 和 j 都是 8。
推荐阅读
- php - DOMXPath::query():渲染上的无效表达式
- jquery - 如何将 ajax 响应数据设置为全局变量?
- javascript - 如何获取多个 API 请求或 URL 并从每个 URL 或 API 请求中检索数据?
- sql - 在 CREATE TABLE 中使用 ON DELETE/UPDATE 时出现缺少关键字错误
- postgresql - AWS Lambda 连接到 EC2 中的 Postgres
- mongodb - MongoDB - 子文档中的上一个和下一个
- php - 如何从mysql表中查找逗号分隔值
- java - 使用 DFS 的 BST 范围和
- python - Julia中不完全伽马函数的拉普拉斯逆变换
- java - System.exit(int) 会终止进程并清除所有资源吗?