鱼C论坛

 找回密码
 立即注册
查看: 1609|回复: 11

[已解决]listbox中lambda表达式的使用

[复制链接]
发表于 2022-5-16 23:24:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lzb1001 于 2022-5-17 00:08 编辑

WIN10/PYTHON3.7.6
----------------------------
# 此例演示Listbox组件

from tkinter import *


root = Tk()



theLB = Listbox(root)
theLB.pack()



for item in ['鸡蛋', '鸭蛋', '鹅蛋', '李狗蛋']:
    theLB.insert(END, item)



Button(root, text='删除它', width=10, font=('华康少女文字 - Kelvin', 10), fg='white', bg='red', command=lambda x=theLB:x.delete(ACTIVE)).pack



root.title('Listbox组件教学示例')



mainloop()

------------------------------

【我的问题】

1、上面代码中红色部分,不太理解为何要用到lambda表达式?

2、如果直接用command=theLB.delete(ACTIVE),我试着替换过发现好像不行,无法删除指定选项,而且4个选项变成3个选项

请大神帮忙解疑释惑系下。
最佳答案
2022-5-17 10:05:16
lzb1001 发表于 2022-5-17 09:35
删除的是“鸡蛋”,它是第一个选项哦

所以它是从上往下删?


嗯,我忘记从哪开始删了,但是原理是一致,从上删一个也是因为你直接赋值 theLB.delete(ACTIVE) 导致的

多选删除实现:
from tkinter import *


root = Tk()




theLB = Listbox(root,selectmode=EXTENDED)
theLB.pack()



for item in ['鸡蛋', '鸭蛋', '鹅蛋', '李狗蛋']:
    theLB.insert(END, item)

def test():
    for i in theLB.curselection()[::-1]:
        theLB.delete(i)


Button(root, text='删除它', width=10, font=('华康少女文字 - Kelvin', 10), fg='white', bg='red', command=test).pack()



root.title('Listbox组件教学示例')



mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-16 23:58:11 | 显示全部楼层
command = 函数     # 不会立即执行 (地址)
command = 函数()  #代码运行即执行

lambda 是匿名函数,提供的的是个地址
from tkinter import *


root = Tk()




theLB = Listbox(root)
theLB.pack()



for item in ['鸡蛋', '鸭蛋', '鹅蛋', '李狗蛋']:
    theLB.insert(END, item)

def test():
    theLB.delete(ACTIVE)


Button(root, text='删除它', width=10, font=('华康少女文字 - Kelvin', 10), fg='white', bg='red', command=test).pack()



root.title('Listbox组件教学示例')



mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-17 00:10:16 | 显示全部楼层
ba21 发表于 2022-5-16 23:58
command = 函数     # 不会立即执行 (地址)
command = 函数()  #代码运行即执行

还是没理解呢……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-17 07:58:12 | 显示全部楼层


上面代码中红色部分,不太理解为何要用到lambda表达式?


因为用 lambda 表达式可以解决传入参数问题,不使用 lambda 表达式只能将 command 赋值为一个函数体,而无法传入参数

如果直接用command=theLB.delete(ACTIVE),我试着替换过发现好像不行,无法删除指定选项,而且4个选项变成3个选项


因为 command 需要接收的是一个函数体,而你这里 theLB.delete(ACTIVE) 属于调用了函数,会将返回结果赋值给 command

此时做出反应的函数就没有效果了(除非你调用的方法返回的还是一个函数体,否则就无法调用)


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-17 08:50:19 | 显示全部楼层
本帖最后由 lzb1001 于 2022-5-17 09:36 编辑
Twilight6 发表于 2022-5-17 07:58
因为用 lambda 表达式可以解决传入参数问题,不使用 lambda 表达式只能将 command 赋值为一个函数 ...


那为什么替换成command=theLB.delete(ACTIVE)运行的话,四个选项会少了第一个“鸡蛋”呢?

用了lambda,结果如下图:
1.png

直接用command=theLB.delete(ACTIVE),结果如下图:
2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-17 08:55:20 | 显示全部楼层
lzb1001 发表于 2022-5-17 08:50
那为什么替换成command=theLB.delete(ACTIVE)运行的话,四个选项会少了一个呢?

用了lambda,结果如 ...




认真看回复哦:"因为 command 需要接收的是一个函数体,而你这里 theLB.delete(ACTIVE) 属于调用了函数" 你一开始就调用了一次函数,不就将最后一个按钮删除了么

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-17 09:33:22 | 显示全部楼层
本帖最后由 lzb1001 于 2022-5-17 09:34 编辑
ba21 发表于 2022-5-16 23:58
command = 函数     # 不会立即执行 (地址)
command = 函数()  #代码运行即执行


theLB = Listbox(root, selectmode=EXTENDED)

即使设置selectmode=EXTENDED多选,但实际也只能删除选中的项目中的最后一个被选中的选项(注意:不是从上往下数的最后一项)

那如何实现多选多删呢???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-17 09:35:56 | 显示全部楼层
本帖最后由 lzb1001 于 2022-5-17 09:40 编辑
Twilight6 发表于 2022-5-17 08:55
认真看回复哦:"因为 command 需要接收的是一个函数体,而你这里 theLB.delete(ACTIVE) 属于调用了 ...


删除的是“鸡蛋”,它是第一个选项哦

所以它是从上往下删?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-17 10:05:16 | 显示全部楼层    本楼为最佳答案   
lzb1001 发表于 2022-5-17 09:35
删除的是“鸡蛋”,它是第一个选项哦

所以它是从上往下删?


嗯,我忘记从哪开始删了,但是原理是一致,从上删一个也是因为你直接赋值 theLB.delete(ACTIVE) 导致的

多选删除实现:
from tkinter import *


root = Tk()




theLB = Listbox(root,selectmode=EXTENDED)
theLB.pack()



for item in ['鸡蛋', '鸭蛋', '鹅蛋', '李狗蛋']:
    theLB.insert(END, item)

def test():
    for i in theLB.curselection()[::-1]:
        theLB.delete(i)


Button(root, text='删除它', width=10, font=('华康少女文字 - Kelvin', 10), fg='white', bg='red', command=test).pack()



root.title('Listbox组件教学示例')



mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-17 11:47:58 | 显示全部楼层
Twilight6 发表于 2022-5-17 10:05
嗯,我忘记从哪开始删了,但是原理是一致,从上删一个也是因为你直接赋值 theLB.delete(ACTIVE) 导致的 ...

感谢,测试了可以批量删除

但不明白为何用[::-1]?这个好像是一个反转的列表,我刚测试用[::]的话不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-17 11:49:10 | 显示全部楼层
lzb1001 发表于 2022-5-17 11:47
感谢,测试了可以批量删除

但不明白为何用[::-1]?这个好像是一个反转的列表,我刚测试用[::]的话不行


删除前面元素会导致索引发生改变,所以我们倒叙过来删除,就不影响前面元素的索引

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-17 12:11:15 | 显示全部楼层
Twilight6 发表于 2022-5-17 11:49
删除前面元素会导致索引发生改变,所以我们倒叙过来删除,就不影响前面元素的索引


谢谢,还真没想到这点……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 08:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表