tkinter 按钮字典中循环的不同命令不起作用
tkinter button different command for loop in dictionary not working
我正在使用字典来存储我的按钮,如您在 main 方法中所见。 'self.tables' 是一个包含 table 个名称的列表。因此,for 循环中的 'i' 是 table 的名称,它以文本形式显示在按钮上。每个按钮都应该有不同的命令,如下所示,self.edit(i)。但是,当您按下特定按钮而不是 运行ning self.edit(i) 时,总是 运行 的是 i 的最新迭代,而不是特定按钮时使用的 i已创建。
def __init__(self, parent, controller):
Frame.__init__(self, parent)
self.controller = controller
self.title = Label(self, text="", font=("arial", 20))
self.title.grid(row=0, column=0)
self.table = ""
self.widgetdata = {}
def main(self):
for x in self.widgetdata:
self.widgetdata[x].grid_forget()
self.tables = GuiSetup.tbls
self.title["text"] = "Select table to edit:"
for j,i in enumerate(self.tables):
self.widgetdata[i] = Button(self, text=i, command=lambda: self.edit(i)) # When any of these buttons are pressed the most recent button command is run
self.widgetdata[i].grid(row=j+1, column=0)
self.controller.show_frame("Edit Menu")
# Sets up the Editmenu gui for editing the specified table
def edit(self, table, id="new"):
print(table)
self.table = table
self.id = id
上面的代码是 class 及其方法的一部分。
我不知道为什么会这样,因为所有按钮上的文本都是唯一的,但每个按钮的命令不是它的设置。任何建议,将不胜感激。谢谢
替换
self.widgetdata[i] = Button(self, text=i, command=lambda: self.edit(i))
来自
self.widgetdata[i] = Button(self, text=i, command=lambda i=i: self.edit(i))
说明: lambda 函数的主体是在单击 Button 时执行的,因此它在执行时使用 i
的当前值(即索引最后创建的 Button),而不是在定义时。创建一个别名参数,强制为每个循环步骤创建一个局部变量,每个都有不同的值,因此引用不同的 Button。
我正在使用字典来存储我的按钮,如您在 main 方法中所见。 'self.tables' 是一个包含 table 个名称的列表。因此,for 循环中的 'i' 是 table 的名称,它以文本形式显示在按钮上。每个按钮都应该有不同的命令,如下所示,self.edit(i)。但是,当您按下特定按钮而不是 运行ning self.edit(i) 时,总是 运行 的是 i 的最新迭代,而不是特定按钮时使用的 i已创建。
def __init__(self, parent, controller):
Frame.__init__(self, parent)
self.controller = controller
self.title = Label(self, text="", font=("arial", 20))
self.title.grid(row=0, column=0)
self.table = ""
self.widgetdata = {}
def main(self):
for x in self.widgetdata:
self.widgetdata[x].grid_forget()
self.tables = GuiSetup.tbls
self.title["text"] = "Select table to edit:"
for j,i in enumerate(self.tables):
self.widgetdata[i] = Button(self, text=i, command=lambda: self.edit(i)) # When any of these buttons are pressed the most recent button command is run
self.widgetdata[i].grid(row=j+1, column=0)
self.controller.show_frame("Edit Menu")
# Sets up the Editmenu gui for editing the specified table
def edit(self, table, id="new"):
print(table)
self.table = table
self.id = id
上面的代码是 class 及其方法的一部分。 我不知道为什么会这样,因为所有按钮上的文本都是唯一的,但每个按钮的命令不是它的设置。任何建议,将不胜感激。谢谢
替换
self.widgetdata[i] = Button(self, text=i, command=lambda: self.edit(i))
来自
self.widgetdata[i] = Button(self, text=i, command=lambda i=i: self.edit(i))
说明: lambda 函数的主体是在单击 Button 时执行的,因此它在执行时使用 i
的当前值(即索引最后创建的 Button),而不是在定义时。创建一个别名参数,强制为每个循环步骤创建一个局部变量,每个都有不同的值,因此引用不同的 Button。