Python-Tkinter,Combobox - 使用Lambda函数传递2个参数

时间:2017-11-20 08:23:46

标签: python lambda tkinter combobox

背景:

具有“跳过组合框”小部件的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)

1 个答案:

答案 0 :(得分:3)

循环中lambda是非常常见的问题。

创建i函数时,它不会复制lambda的值,但会保留对i的引用。因此,所有函数都引用相同的变量(内存中的相同位置),并且当它们被推算时它们从i获得值。

您必须将i分配给lambda中的参数(例如x=i),并在函数中使用此参数x。这样,它将从i复制当前值并在lambda函数

中使用
lambda event, x=i : self.but_callback(event, x)