Tkinter标签旧内容未清除,新问题叠加显示的解决求助
乘法练习GUI标签残留问题解决方案
你的问题核心原因是重复创建标签导致全局变量被覆盖:在show_sum()函数中,每次都会新建一个l1标签并赋值给同名变量,这使得后续的清除操作(比如clear_sum()或l1.config(text=""))只对新创建的标签生效,而最初在窗口布局里的原始标签完全没被修改,因此旧问题文本会一直残留。
修改后的完整代码
import random import tkinter as tk from tkinter import font from datetime import datetime now = datetime.now() s2 = now.strftime("%d/%m/%Y, %H:%M:%S") questions_asked = 0 score = 0 number1 = 0 number2 = 0 def clear_text(): e1.delete(0, 'end') def getName(): return e2.get() def show_sum(): # 直接修改已存在的l1标签文本,不再新建标签 global number1, number2 number1 = random.randrange(1, 12) number2 = random.randrange(1, 12) l1.config(text=f"What is {number1} x {number2}?") def Submit(): global questions_asked, score right_answer = number1 * number2 answer = int(e1.get()) if answer == right_answer: l2.config(text='Correct') score += 1 else: l2.config(text=f"Not correct, the correct answer is {right_answer}") questions_asked += 1 clear_text() l1.config(text="") # 清除当前问题文本 l3.config(text=f"Score {score}") if questions_asked >= 20: name = e2.get() btn3.configure(state=tk.DISABLED) btn1.configure(state=tk.DISABLED) l4.config(text=f"Game Over {name.capitalize()} - You got {score} out of {questions_asked} correct") with open('Results.txt', "a") as f: f.write(f'\n{s2} , {name.capitalize()} , {score}') window = tk.Tk() window.title("Multiplication Practise") window.geometry("1000x500") window.config(bg="#A569BD") custom_font = font.Font(size=20) l5 = tk.Label(window, font=custom_font, text="Name") l5.grid(column=0, row=0, padx=10, pady=30) e2 = tk.Entry(window, font=custom_font) e2.grid(column=1, row=0) # 只创建一次l1标签,后续通过config更新内容 l1 = tk.Label(window, font=custom_font, text="") l1.grid(column=0, row=1, padx=10, pady=10) e1 = tk.Entry(window, font=custom_font) e1.grid(column=1, row=1, padx=10, pady=10) btn1 = tk.Button(window, font=custom_font, text="Check Answer", bg="lightgreen", command=lambda: [Submit(), show_sum()]) btn1.grid(column=2, row=1, padx=10, pady=10) btn3 = tk.Button(window, font=custom_font, text="Submit Name", state=tk.NORMAL, bg="lightgreen", command=lambda: [show_sum(), getName()]) btn3.grid(column=2, row=0, padx=10, pady=10) l2 = tk.Label(window, font=custom_font) l2.grid(column=1, row=2, padx=10, pady=10) # 分数标签 l3 = tk.Label(window, font=custom_font, text=f"Score {score}") l3.grid(column=0, row=3, padx=10, pady=10) # 最终结果标签 blank = tk.PhotoImage() l4 = tk.Label(window, image=blank, text="", font=custom_font, width=600, height=50, compound="c", bd=0, padx=0) l4.grid(column=1, row=3, columnspan=2, padx=10, pady=10) window.mainloop()
关键改动说明
- 移除重复创建标签的操作:
show_sum()函数不再新建l1标签,而是直接用l1.config(text=...)更新已存在标签的内容,确保所有操作都作用于同一个标签。 - 简化全局变量管理:提前声明
number1和number2为全局变量,避免函数内重复声明导致的变量作用域问题。 - 优化代码冗余:删除了重复的
clear_sum()函数,直接在需要清除标签的地方调用l1.config(text="");同时简化了Submit函数的逻辑,减少重复代码。 - 使用f-string优化文本拼接:让代码更简洁易读,避免繁琐的字符串相加操作。
- 改用with语句处理文件:自动管理文件资源,避免忘记关闭文件的问题。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

