Tkinter中调用destroy()删除Label无效,求正确实现方式
解决Tkinter中Label组件无法用destroy()删除的问题
问题说明
开发Tkinter应用时,尝试用destroy()方法删除Label组件但无效,需要正确的删除方式。
原基础代码
import tkinter from tkinter import * from tkinter import ttk window=Tk() window.minsize(300,200) window.title("COMBO 3 PIECE 1 SODA") # 问题:匿名创建Label,未保存实例引用 Label(text="UFC make fight",font=20,pady=10 ,padx=10).grid(row=0,column=0,sticky=W) opponet=StringVar(value="คู่ต่อสู้ของคุณ") combo2=ttk.Combobox(textvariable=opponet) combo2["value"]=("Conor Mcgregor","Jorge Masvidal","Colby Covington","Tony Ferguson","Sean O malley") combo2.grid(row=0,column=2) choice = StringVar(value="เลือกนักสู้ของคุณ") combo=ttk.Combobox(textvariable=choice) combo["value"]=("Conor Mcgregor","Jorge Masvidal","Colby Covington","Tony Ferguson","Sean O malley") combo.grid(row=0,column=1) #betodd2 = IntVar() #betset2=Entry(font=30,width=10,textvariable=betodd2).grid(row=1,column=2) # 问题:匿名创建Label,无引用 Label(text="ประเมินทักษะมวยปล้ำ",font=20,pady=10 ,padx=10).grid(row=1,column=0,sticky=W) Label(text="ค่าทักษะมวยสากล",font=20,pady=10 ,padx=10).grid(row=2,column=0,sticky=W) Label(text="ค่าทักษะมวยไทย",font=20,pady=10 ,padx=10).grid(row=3,column=0,sticky=W) Label(text="ค่าทักษะBJJ",font=20,pady=10 ,padx=10).grid(row=4,column=0,sticky=W) WrestlingPoint1 = IntVar() Spinbox(from_=1,to=10,textvariable=WrestlingPoint1).grid(row=1,column=1) WrestlingPoint2 = IntVar() Spinbox(from_=1,to=10,textvariable=WrestlingPoint2).grid(row=1,column=2) BoxingPoint1 = IntVar() Spinbox(from_=1,to=10,textvariable=BoxingPoint1).grid(row=2,column=1) BoxingPoint2 = IntVar() Spinbox(from_=1,to=10,textvariable=BoxingPoint2).grid(row=2,column=2) MuayThaiPoint1 = IntVar() Spinbox(from_=1,to=10,textvariable=MuayThaiPoint1).grid(row=3,column=1) MuayThaiPoint2 = IntVar() Spinbox(from_=1,to=10,textvariable=MuayThaiPoint2).grid(row=3,column=2) BJJPoint1 = IntVar() Spinbox(from_=1,to=10,textvariable=BJJPoint1).grid(row=4,column=1) BJJPoint2 = IntVar() Spinbox(from_=1,to=10,textvariable=BJJPoint2).grid(row=4,column=2) Label(text="รวมผลคะแนน",font=20,pady=10 ,padx=10).grid(row=5,column=0,sticky=W) Label(text="คะแนนนักสู้คนที่ 1 ",font=20,pady=10 ,padx=10).grid(row=6,column=1) Label(text="คะแนนนักสู้คนที่ 2 ",font=20,pady=10 ,padx=10).grid(row=6,column=2) content1="" content2="" txt_input= StringVar(value="0") txt_input2= StringVar(value="0") # 问题:链式调用grid,TOTAL1实际为None,不是Entry实例 TOTAL1=Entry(font=('impact',15,'bold'),fg='black',bg='red',width=10,textvariable=txt_input).grid(row=5, column=1) TOTAL2=Entry(font=('impact',15,'bold'),fg='black',bg='red',width=10,textvariable=txt_input2).grid(row=5, column=2) going=Label(window) going2=Label(window) #summary=Entry(font=('impact',15,'bold'),fg='black',bg='red',width=10,textvariable=txt_input).grid(row=10, column=0,columnspan=0)
原clearcommand函数代码
def clearcommand(): global content1 content1 = "" global content2 content2 = "" # 问题:重新创建StringVar,未关联原有Entry txt_input = StringVar(value="0") txt_input2 = StringVar(value="0") # 问题:调用Label类的destroy方法,不是实例方法,无效 Label.destroy() # 问题:重复创建Entry覆盖位置,而非清空原有内容 TOTAL1 = Entry(font=('impact', 15, 'bold'), fg='black', bg='red', width=10, textvariable=txt_input).grid(row=5, column=1) TOTAL2 = Entry(font=('impact', 15, 'bold'), fg='black', bg='red', width=10, textvariable=txt_input2).grid(row=5, column=2) confirm['state']=NORMAL clear=Button(text="เคลียร์ข้อมูล",command=clearcommand,font=30,background='red').grid(row=11,column=2)
正确解决方案
核心问题分析
- 匿名组件无法销毁:创建Label时直接链式调用
.grid(),未保存组件实例引用,后续无法调用destroy()。 - 错误调用类方法:
Label.destroy()是调用Label类的方法,不是具体实例的方法,完全无效。 - 变量处理错误:重新创建
StringVar不会更新原有Entry内容,应使用set()方法修改已有变量的值。
修改后的完整代码
import tkinter from tkinter import * from tkinter import ttk window=Tk() window.minsize(300,200) window.title("COMBO 3 PIECE 1 SODA") # 保存所有需要销毁的Label实例 label_title = Label(text="UFC make fight",font=20,pady=10 ,padx=10) label_title.grid(row=0,column=0,sticky=W) opponet=StringVar(value="คู่ต่อสู้ของคุณ") combo2=ttk.Combobox(textvariable=opponet) combo2["value"]=("Conor Mcgregor","Jorge Masvidal","Colby Covington","Tony Ferguson","Sean O malley") combo2.grid(row=0,column=2) choice = StringVar(value="เลือกนักสู้ของคุณ") combo=ttk.Combobox(textvariable=choice) combo["value"]=("Conor Mcgregor","Jorge Masvidal","Colby Covington","Tony Ferguson","Sean O malley") combo.grid(row=0,column=1) # 保存技能相关Label实例 label_wrestling = Label(text="ประเมินทักษะมวยปล้ำ",font=20,pady=10 ,padx=10) label_wrestling.grid(row=1,column=0,sticky=W) label_boxing = Label(text="ค่าทักษะมวยสากล",font=20,pady=10 ,padx=10) label_boxing.grid(row=2,column=0,sticky=W) label_muaythai = Label(text="ค่าทักษะมวยไทย",font=20,pady=10 ,padx=10) label_muaythai.grid(row=3,column=0,sticky=W) label_bjj = Label(text="ค่าทักษะBJJ",font=20,pady=10 ,padx=10) label_bjj.grid(row=4,column=0,sticky=W) WrestlingPoint1 = IntVar() Spinbox(from_=1,to=10,textvariable=WrestlingPoint1).grid(row=1,column=1) WrestlingPoint2 = IntVar() Spinbox(from_=1,to=10,textvariable=WrestlingPoint2).grid(row=1,column=2) BoxingPoint1 = IntVar() Spinbox(from_=1,to=10,textvariable=BoxingPoint1).grid(row=2,column=1) BoxingPoint2 = IntVar() Spinbox(from_=1,to=10,textvariable=BoxingPoint2).grid(row=2,column=2) MuayThaiPoint1 = IntVar() Spinbox(from_=1,to=10,textvariable=MuayThaiPoint1).grid(row=3,column=1) MuayThaiPoint2 = IntVar() Spinbox(from_=1,to=10,textvariable=MuayThaiPoint2).grid(row=3,column=2) BJJPoint1 = IntVar() Spinbox(from_=1,to=10,textvariable=BJJPoint1).grid(row=4,column=1) BJJPoint2 = IntVar() Spinbox(from_=1,to=10,textvariable=BJJPoint2).grid(row=4,column=2) label_total = Label(text="รวมผลคะแนน",font=20,pady=10 ,padx=10) label_total.grid(row=5,column=0,sticky=W) label_fighter1 = Label(text="คะแนนนักสู้คนที่ 1 ",font=20,pady=10 ,padx=10) label_fighter1.grid(row=6,column=1) label_fighter2 = Label(text="คะแนนนักสู้คนที่ 2 ",font=20,pady=10 ,padx=10) label_fighter2.grid(row=6,column=2) content1="" content2="" txt_input= StringVar(value="0") txt_input2= StringVar(value="0") # 分开创建Entry和布局,保存实例引用 total_entry1 = Entry(font=('impact',15,'bold'),fg='black',bg='red',width=10,textvariable=txt_input) total_entry1.grid(row=5, column=1) total_entry2 = Entry(font=('impact',15,'bold'),fg='black',bg='red',width=10,textvariable=txt_input2) total_entry2.grid(row=5, column=2) going=Label(window) going2=Label(window) # 补充原代码缺失的confirm按钮定义 confirm = Button(text="确认", state=NORMAL) confirm.grid(row=11, column=1) def clearcommand(): global content1, content2 content1 = "" content2 = "" # 修改已有StringVar的值,更新Entry内容 txt_input.set("0") txt_input2.set("0") # 销毁指定的Label实例 label_title.destroy() label_wrestling.destroy() label_boxing.destroy() label_muaythai.destroy() label_bjj.destroy() label_total.destroy() label_fighter1.destroy() label_fighter2.destroy() # 若需要恢复组件,可重新实例化并布局 new_label_title = Label(text="UFC make fight",font=20,pady=10 ,padx=10) new_label_title.grid(row=0,column=0,sticky=W) confirm['state']=NORMAL clear=Button(text="เคลียร์ข้อมูล",command=clearcommand,font=30,background='red').grid(row=11,column=2) window.mainloop()
关键修改点
- 保存组件实例:创建Label和Entry时,先实例化赋值给变量,再调用
.grid()布局,确保持有组件引用。 - 调用实例的destroy():通过保存的变量(如
label_title.destroy())调用具体组件的销毁方法,而非类方法。 - 正确更新Entry内容:使用
txt_input.set("0")修改已有StringVar的值,原有Entry会自动更新显示。 - 按需重新创建组件:销毁后若需恢复组件,重新实例化并布局即可。
内容的提问来源于stack exchange,提问作者Michael iron
相关产品推荐
相关产品推荐

