如何在tkinter中正确使用Checkbox实现点击后删除自身的功能
代码运行原理解答
你的理解存在部分偏差,我们按执行流程拆解后就可以清晰梳理逻辑:
核心执行步骤拆解
- 点击Ok按钮触发第一层逻辑
按钮绑定的回调是lambda: insert_Task(insert_Entry.get()),会先执行insert_Entry.get()拿到输入框的文本字符串,再把这个字符串作为参数传入insert_Task函数,此时insert_Task的形参name初始值是输入的文本字符串,不是Checkbutton对象。 - insert_Task函数内部的执行顺序是关键
Python执行赋值语句时,会先计算等号右侧的所有表达式,再把结果赋值给等号左侧的变量,所以name = Checkbutton(root, text=name, command= lambda: del_task(name))的执行顺序是:- 先计算
text=name:此时局部变量name还未被重新赋值,还是传入的文本字符串,所以Checkbutton的显示文本就是你输入的内容,这部分你的理解是正确的。 - 再计算
command= lambda: del_task(name):这里的lambda是闭包,捕获的是局部变量name本身,而非当前的变量值。 - 完成Checkbutton对象创建后,才会把这个对象赋值给左侧的局部变量
name,此时name的取值才从字符串变为Checkbutton对象。
- 先计算
- 点击Checkbutton触发删除逻辑
当你点击生成的复选框时,lambda回调执行,此时用到的name已经是被赋值后的Checkbutton对象,传入del_task后调用destroy()方法就能正常删除对应组件。
写法优化建议
这段代码用同一个变量名存储两种完全不同类型的值(字符串、UI组件),非常容易造成理解混淆,建议分开命名,逻辑会清晰很多:
from tkinter import * root = Tk() def insert_Task(task_text): # 单独用变量存储复选框对象,不和文本参数混淆 check_btn = Checkbutton(root, text=task_text, command= lambda: del_task(check_btn)) check_btn.pack() def del_task(btn): btn.destroy() insert_Entry = Entry(root) insert_Button = Button(root, text="Ok", command=lambda: insert_Task(insert_Entry.get())) insert_Entry.pack() insert_Button.pack() root.mainloop()
内容的提问来源于stack exchange,提问作者bababooey2
相关产品推荐
相关产品推荐

