为何在Tkinter项目中使用lambda绑定OptionMenu命令时,已传递位置参数仍报“<lambda>() takes 0 positional arguments but 1 was given”错误?
嘿,这个错误其实很好解决——问题出在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函数
除了回调参数的问题,你的函数里还有两个小细节可以调整,避免后续报错:
listbox.delete()缺少参数,Tkinter的Listbox清空操作需要指定范围0到tk.END- 硬编码路径拼接容易出问题,用
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
相关产品推荐
相关产品推荐

