如何无需绑定按钮删除Tkinter的Label?求check函数内移除score_label的方法
问题解决方法
你调用destroy失效的核心原因是:创建Label时直接将grid()方法和实例化写在同一行赋值,grid()方法没有返回值,因此你的score_label变量实际存储的是None,自然无法调用组件的销毁方法。
修改步骤
- 组件实例化和布局操作拆分,保证变量存储的是Label组件对象
- check函数中引入全局的
score_label变量,第一次答对时调用destroy方法销毁临时组件
代码修改示例
初始化部分修改
# 原错误写法 # score_label = tkinter.Label(...).grid(...) # 修改为拆分写法,保证变量存储的是Label实例 score_label = tkinter.Label(master=master, text=f"score: {score}",font=my_font,fg="white",bg='#08241c') score_label.grid(row=2, column=2,sticky=W) # 其他需要更新的Label也建议按同样方式修改,避免后续出现同类问题 question_label = tkinter.Label(master=master, text=f"{q_num}: {eq}",font=my_font,fg="white",bg='#08241c') question_label.grid(row=2, column=5,sticky=W) stage_label = tkinter.Label(master = master,text=f"Stage: {current_stage}",font=my_font,fg="white",bg='#08241c') stage_label.grid(row=2, column= 3,sticky=W)
check函数修改
def check(text:tkinter.Text, event=None): # 加入score_label的全局声明,避免函数内创建局部变量覆盖全局 global remove_label, eq, score, q_num, current_stage, score_label, question_label, stage_label ans = calc(eq) temp = str(text.get("0.0", "end").strip()) if temp == str(ans): is_correct = True remove_label += 1 else: is_correct = False if is_correct: score += 10 q_num += 1 inputtxt.delete(1.0,END) eq = generate_equation(stage=current_stage) # 第一次答对时销毁临时score_label if remove_label == 1: score_label.destroy() # 如果需要创建全新的score_label,可在这里重建 score_label = tkinter.Label(master=master, text=f"score: {score}",font=my_font,fg="white",bg='#08241c') score_label.grid(row=2, column=2,sticky=W) else: # 非第一次答对直接修改文本即可,无需反复销毁重建 score_label.config(text=f"score: {score}") # 其他Label同理直接修改文本即可,性能更优 question_label.config(text=f"{q_num}: {eq}") stage_label.config(text=f"Stage: {current_stage}") inputtxt.grid(row=3,column=4,sticky=W,ANCHOR=CENTER) if score % 100 == 0: current_stage += 1 else: inputtxt.grid(row=3,column=4,sticky=W)
内容的提问来源于stack exchange,提问作者Guy zvi
相关产品推荐
相关产品推荐

