【问题标题】:Python-Tkinter,Combobox - Passing 2 parameters using Lambda functionPython-Tkinter,Combobox - 使用 Lambda 函数传递 2 个参数
【发布时间】:2017-11-20 08:23:45
【问题描述】:

背景:

具有“跳过组合框”小部件的 GUI 表允许用户跳过当前行执行。此 GUI 中的行数各不相同。这个“跳过”是使用 for 循环创建的。

在选择“开”或“关”A bind进程执行一个名为self.but_callback的方法,执行其余的代码。

目标:

i 值传递给self.but_callback,以及event 所需的bind

下面的代码显示了尝试将i 值直接传递给self.but_callback(event,i) 但是 而不是分配正确的i 值,它为每个skip_button 传递for 循环的最后一个值已创建。

问题:如何在循环中传递正确的i 值,当需要使用lambda 函数传递2 个参数时。

没有找到任何结合这两个问题的答案。

   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)

【问题讨论】:

  • 在问这个问题之前你有没有做任何研究?可能有数百个问题的答案与循环创建小部件有关。
  • 是的,我做到了!我发现的所有内容都没有解释如何将附加参数传递给方法。
  • lambda event, x=i : self.but_callback(event, x)
  • 顺便说一句:lambda in loop 是常见问题 - SO 和互联网上有很多问题和答案。

标签: python lambda tkinter combobox


【解决方案1】:

lambda 在循环中是很常见的问题。

当您创建lambda 函数时,它不会从i 复制值,但它会保留对i 的引用。所以所有函数都引用了同一个变量(内存中的同一个地方),并且当它们被执行时它们从i 中获取值。

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

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

【讨论】:

    猜你喜欢
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多