因此我尝试创建一个带有按钮的电路板,用于称为" 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)
我只得到网格的最后位置。我该怎么办?
答案 0 :(得分:0)
使用partial
代替lambda
:
from functools import partial
...
btn = Button(frame,bg=board[x][y],command=partial(move, x, y, board[x][y])
还有其他选择,但这是我倾向于做的。以你的方式使用lambda,只记住名称x
,y
等,而不是它们在for循环的任何给定迭代中指向的对象,所以在结束时循环x
和y
将指向其最近的值,这将传递给move()
。使用partial()
x
和y
在每次迭代时指向的值是"冻结&#34}使用该函数,以便在最终按下Button
时传递所需的值。