【问题标题】:Why is lambda returning "<lambda>() takes 0 positional arguments but 1 was given" when I gave a positional argument?当我给出位置参数时,为什么 lambda 会返回“<lambda>() 接受 0 个位置参数但给出了 1”?
【发布时间】:2023-03-03 10:38:01
【问题描述】:
def changedir(listbox):
    choice = varus.get()
    os.getcwd()
    os.chdir("C:/Users/haris/" + choice)
    directory = os.listdir("C:/Users/haris/" + choice)
    listbox.delete()
    directory = sorted(((os.stat(line).st_mtime, line) for line in directory if line.endswith('.zip')), reverse=1)
    for unixtime, line in directory:
        kws = datetime.fromtimestamp(unixtime)
        listbox.insert(tk.END, line, 'Date modified:', kws.date(), "\n")

所以这是我用于我的 tkinter 项目的功能/命令,但由于某种原因,每当我点击下拉菜单时:

dropdown = tk.OptionMenu(window,
                         varus,
                         *certifiedpoop,
                         command=lambda:changedir(list))

我总是遇到这个错误:

"<lambda>() takes 0 positional arguments but 1 was given" 

这是怎么回事???

【问题讨论】:

  • command=lambda:changedir(list))没有位置参数
  • @juanpa.arrivillaga 它似乎实际上给出了一个位置参数,似乎选择的值作为第一个参数传递给函数,最简单的修复似乎只是做command=lambda _: changedir(list)
  • lambda:changedir(list) 表示“一个未命名的函数 (lambda),它接受 0 个参数(相当于:有 0 个参数),无论如何都调用 changedir(list),并返回结果”。当您与OptionMenu 交互时,Tkinter 将尝试将参数传递给您分配的command 函数。您的代码没有考虑到这个论点。要了解此论点的目的,您应该阅读文档

标签: python tkinter lambda drop-down-menu operating-system


【解决方案1】:

OptionMenucommand 选项的回调需要一个参数,即所选值,因此您需要为 lambda 提供一个参数。

您也可以将此参数传递给changedir(),这样您就不需要在其中调用varus.get()

def changedir(listbox, choice):
    os.getcwd()
    os.chdir("C:/Users/haris/" + choice)
    directory = os.listdir("C:/Users/haris/" + choice)
    #listbox.delete()
    listbox.delete(0, 'end')
    directory = sorted(((os.stat(line).st_mtime, line) for line in directory if line.endswith('.zip')), reverse=1)
    for unixtime, line in directory:
        kws = datetime.fromtimestamp(unixtime)
        listbox.insert(tk.END, line, 'Date modified:', kws.date(), "\n")

...

dropdown = tk.OptionMenu(window,
                         varus,
                         *certifiedpoop,
                         command=lambda v:changedir(list, v))

【讨论】:

    【解决方案2】:

    您看到的错误暗示您在构建OptionMenu 小部件时作为command 参数传递的lambda 接受了一个作为所选项目的参数。如果愿意,您可以选择忽略它,但它仍然需要接受该参数。

    例如:

    dropdown = tk.OptionMenu(window,
                             varus,
                             *certifiedpoop,
                             command=lambda selected: changedir(list))
    

    【讨论】:

      【解决方案3】:

      tk.OptionMenu 将新值作为参数传递给command 指定的函数。

      您可以忽略它,但必须将其包含在 lambda 定义中:lambda x: changedir(list))

      【讨论】:

        猜你喜欢
        • 2020-12-29
        • 2020-06-13
        • 1970-01-01
        • 2013-09-23
        • 1970-01-01
        • 2017-10-05
        • 2016-01-30
        • 2019-06-26
        • 2014-11-12
        相关资源
        最近更新 更多