背景:
具有“跳过组合框”小部件的GUI表,允许用户跳过执行的当前行。此GUI中的行数不尽相同。这个“跳过”是使用for循环创建的。
当选择“开启”或“关闭”时,bind
进程执行一个名为self.but_callback
的方法,该方法执行剩余的代码。
目标:
将i
值传递给self.but_callback
以及event
所需的bind
。
下面的代码显示尝试将i
值直接传递到self.but_callback(event,i)
但是,而不是分配它传递的最后一个值的正确i
值每个skip_button
创建的循环。
问题:如果需要使用i
函数传递2个参数,如何在循环中传递正确的lambda
值。
没有找到任何结合这两个问题的答案。
for i in range(len(data_from_file)):
#Skip button
self.var.append(tk.StringVar())
self.var[7].set('On')
skip_button = ttk.Combobox(inner_frame, width=5, textvariable=self.var[7], values=['On','Off'],state='readonly', justify=tk.CENTER)
skip_button.bind('<<ComboboxSelected>>',lambda event: self.but_callback(event,i))
skip_button.grid(row=i+1, column=7, padx=8)
def but_callback(self,event,x):
print(x)
答案 0 :(得分:3)
循环中lambda
是非常常见的问题。
创建i
函数时,它不会复制lambda
的值,但会保留对i
的引用。因此,所有函数都引用相同的变量(内存中的相同位置),并且当它们被推算时它们从i
获得值。
您必须将i
分配给lambda
中的参数(例如x=i
),并在函数中使用此参数x
。这样,它将从i
复制当前值并在lambda
函数
lambda event, x=i : self.but_callback(event, x)