【发布时间】:2020-07-13 02:02:05
【问题描述】:
我正在尝试使用 tkinter 制作井字游戏。当我在 3x3 板上实例化按钮时,每个按钮都调用 mark_square() 的函数,并将它们自己作为参数,每个按钮都将引用嵌套 for 循环中实例化的最后一个按钮。
人们建议我将 lambda 函数绑定到我在这段代码中所做的按钮:
from tkinter import *
from tkinter import messagebox
turn = "X"
def mark_square(box):
global turn
if box.cget('text') == " ":
box['text'] = turn
else:
messagebox.showerror(title="Invalid", message="Invalid")
root = Tk()
root.title("Tic-Tac-Toe")
for x in range(0, 3):
for y in range(0, 3):
grid_box = Button(text=" ", font=("Arial", 40), padx=20, command=lambda grid_box=grid_box: mark_square(grid_box))
grid_box.grid(row=x, column=y)
root.mainloop()
但是,我收到一条错误消息,告诉我 grid_box 未定义。有谁知道发生了什么以及如何解决它?
【问题讨论】:
-
您没有正确执行此操作,因为您试图将
grid_box的值作为参数的默认值传递给lambda函数,但是在第一次迭代中for循环,该变量尚不存在,这将导致错误......即使它不存在,每次它都会引用最后一次分配给变量的值(这将是 上一个Button)。 -
grid_box尚未创建。所以创建后使用grid_box.config(command=lambda ...)。 -
发布完整的追溯消息。它显示了失败的确切错误和行。