Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Tk中创建按钮网格,并使用其网格位置作为参数调用函数_Python_For Loop_Tkinter - Fatal编程技术网

Python 如何在Tk中创建按钮网格,并使用其网格位置作为参数调用函数

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]

我正在尝试使用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] = (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时捕获值,而不是捕获对变量的引用