Python Tkinter按钮回调Lambda意外结果

Python Tkinter按钮回调Lambda意外结果,python,tkinter,Python,Tkinter,我想创建多行tkinter小部件,我认为将它们存储在字典中是一种干净的方法。不过,我很难让按钮的回调正常工作。在代码保持不变的情况下,传递给按钮回调的值总是E,我不明白为什么会这样。请告诉我如何将正确的键传递给回调-即第一行是A,第二行是B,等等 import tkinter as tk NUM_ROWS = 5 BOLD_FONT = ("calbri", 16, "bold") NORMAL_FONT = ("calbri", 1

我想创建多行
tkinter
小部件,我认为将它们存储在字典中是一种干净的方法。不过,我很难让按钮的回调正常工作。在代码保持不变的情况下,传递给按钮回调的值总是
E
,我不明白为什么会这样。请告诉我如何将正确的键传递给回调-即第一行是
A
,第二行是
B
,等等

import tkinter as tk

NUM_ROWS = 5
BOLD_FONT = ("calbri", 16, "bold")
NORMAL_FONT = ("calbri", 16, "normal")


def submit():
    print("you win")


def clear(key):
    print(key)
    # widgets[key]["factor_field"].delete(0,"end")
    # widgets[key]["factor_field"].insert(0, key)


data = {}
widgets = {}

root = tk.Tk()

# Build widgets
for i in range(NUM_ROWS):
    key = chr(i + 65)
    this_row = widgets[key] = {}
    this_row["label"] = tk.Label(root, text=key, font=BOLD_FONT)
    this_row["label"].grid(row=i, column=0, padx=5, pady=10)
    this_row["factor_field"] = tk.Entry(root, width=60, font=NORMAL_FONT)
    this_row["factor_field"] .grid(row=i, column=1, padx=5, pady=10)
    this_row["target_node_field"] = tk.Entry(root, width=5, font=NORMAL_FONT)
    this_row["target_node_field"].grid(row=i, column=2, padx=5, pady=10)
    this_row["clear_button"] = tk.Button(root, text="Clear", command=lambda: clear(
        key), font=BOLD_FONT).grid(row=i, column=3, padx=5, pady=10)

submit_button = tk.Button(root, text="Submit", command=submit,
                          font=BOLD_FONT).grid(row=NUM_ROWS + 1, column=0, padx=5, pady=10)

print(widgets)
root.mainloop()
使用以下命令:

this_row["clear_button"] = tk.Button(root, text="Clear", 
                                     command=lambda x=key: clear(x), 
                                     font=BOLD_FONT)
this_row["clear_button"].grid(row=i, column=3, padx=5, pady=10)


在当前代码中,
变量的值在
for
循环完成后固定为
E
。因此,您现有的lambda函数将始终调用
clear('E')

使用
command=lambda key=key:clear(key)
而不是command=lambda:clear(key)。