You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在Tkinter项目中使用lambda绑定OptionMenu命令时,已传递位置参数仍报“<lambda>() takes 0 positional arguments but 1 was given”错误?

解决Tkinter OptionMenu命令参数不匹配的错误

嘿,这个错误其实很好解决——问题出在OptionMenu的command回调机制上。

当你点击OptionMenu里的选项时,Tkinter会自动把当前选中的选项值作为参数传递给你绑定的command函数。但你写的lambda:changedir(list)没有定义任何参数来接收这个值,所以Python就会抛出takes 0 positional arguments but 1 was given的错误。

修复方案

最简单的办法是给lambda加一个占位参数(哪怕你不需要用到它),通常用下划线_来表示这个参数是“忽略”的:

# 注意:不要用list当变量名,它是Python内置函数,换成listbox更合理
dropdown = tk.OptionMenu(window, varus, *certifiedpoop, command=lambda _: changedir(listbox))

顺便优化你的changedir函数

除了回调参数的问题,你的函数里还有两个小细节可以调整,避免后续报错:

  1. listbox.delete()缺少参数,Tkinter的Listbox清空操作需要指定范围0到tk.END
  2. 硬编码路径拼接容易出问题,用os.path.join()更跨平台

修改后的changedir函数:

def changedir(listbox):
    choice = varus.get()
    # 用os.path.join拼接路径,更健壮
    target_dir = os.path.join("C:/Users/haris/", choice)
    os.chdir(target_dir)
    directory = os.listdir(target_dir)
    # 清空列表框的正确写法
    listbox.delete(0, tk.END)
    # 按修改时间排序zip文件
    directory = sorted(
        ((os.stat(line).st_mtime, line) for line in directory if line.endswith('.zip')),
        reverse=True
    )
    for unixtime, line in directory:
        kws = datetime.fromtimestamp(unixtime)
        listbox.insert(tk.END, f"{line} | Date modified: {kws.date()}")

这里我把插入的文本改成了更简洁的格式,避免\n导致的列表项换行问题(Listbox的insert默认是每个调用添加一个项,换行符会显示成乱码)。

内容的提问来源于stack exchange,提问作者Crystallean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:49:39