Python 如何在Tk中创建按钮网格,并使用其网格位置作为参数调用函数
我正在尝试使用Tkinter制作一个简单的游戏板,它带有按钮,可以改变2D数组中的单个项目,对应于它在窗口中的位置-因此我可以通过检查数组来检查游戏是否结束。这是我的代码:Python 如何在Tk中创建按钮网格,并使用其网格位置作为参数调用函数,python,for-loop,tkinter,Python,For Loop,Tkinter,我正在尝试使用Tkinter制作一个简单的游戏板,它带有按钮,可以改变2D数组中的单个项目,对应于它在窗口中的位置-因此我可以通过检查数组来检查游戏是否结束。这是我的代码: from tkinter import * root = Tk() board = [] for x in range(8): board.append([0,0,0,0,0,0,0,0]) def toggle(row,column): global board board[row][column]
from tkinter import *
root = Tk()
board = []
for x in range(8):
board.append([0,0,0,0,0,0,0,0])
def toggle(row,column):
global board
board[row][column] = (board[row][column]+1)%2
print("-"*10)
for x in board:
for y in x:
print(y, end="")
print("")
print("-"*10)
for x in range(8):
for y in range(8):
button = Button(master=root, text="--", command=lambda:toggle(y,x))
button.grid(row=y,column=x)
root.mainloop()
然而,这只是给了所有的按钮命令切换(7,7),它们都只是切换板中最后一项的最后一项。我尝试了一个老问题,但我认为它是python2,因为解决方案没有改变我的代码的任何内容。作为的答案,提供的源代码缺少一些内容
当声明附加到每个按钮的命令时,lambda
必须在参数y,x
和网格参数row=y,column=x
之间建立链接:
button = Button(master=root, text=xy_text,
command=lambda row=x, column=y: toggle(row, column))
button.grid(row=y,column=x)
快速解决办法是:
def create_toggle_callback(y, x):
return lambda: toggle(y, x)
并将按钮命令设置为:
button = Button(master=root, text="--", command=create_toggle_callback(y, x))
原因是python中变量作用域对闭包的工作方式。例如,见。基本上,我们需要在定义lambda时捕获值,而不是捕获对变量的引用