按钮网格不太顺利

时间:2017-01-06 14:45:37

标签: python-3.x tkinter

因此我尝试创建一个带有按钮的电路板,用于称为" othello"虽然我想首先测试按钮,所以我用一个简单的命令来打印按钮的位置。很简单吧?这是代码

WHITE='white'
BLACK='black'
n=8
No_changes=0
changes=list()
from tkinter import *
def create_board():
    board=[['lawn green' for count in range(n)]for rows in range(n)]
    board[3][3]=WHITE
    board[3][4]=BLACK
    board[4][3]=BLACK
    board[4][4]=WHITE
    return board
def print_board(board):
    root = Tk()
    Grid.rowconfigure(root, 0, weight=1)
    Grid.columnconfigure(root, 0, weight=1)
    frame=Frame(root)
    frame.grid(row=0,column=0,sticky=N+E+S+W)
    for x in range(8):
        for y in range(8):
            Grid.rowconfigure(frame,x,weight=1)
            Grid.columnconfigure(frame,y,weight=1)
            btn = Button(frame,bg=board[x][y],command=lambda:move(x,y,board[x][y]))
            btn.grid(column=x,row=y,padx=5,pady=5, sticky=N+S+E+W)
    root.mainloop()
def move(row,column,who):
    print(row,column,who)
board=create_board()
print_board(board)

我只得到网格的最后位置。我该怎么办?

1 个答案:

答案 0 :(得分:0)

使用partial代替lambda

from functools import partial
...
btn = Button(frame,bg=board[x][y],command=partial(move, x, y, board[x][y])

还有其他选择,但这是我倾向于做的。以你的方式使用lambda,只记住名称xy等,而不是它们在for循环的任何给定迭代中指向的对象,所以在结束时循环xy将指向其最近的值,这将传递给move()。使用partial() xy在每次迭代时指向的值是"冻结&#34}使用该函数,以便在最终按下Button时传递所需的值。