Tkinter循环中弹出多余空白窗口问题求助(附代码)
心算测验程序计时器弹窗问题修复方案
你的代码弹出空白窗口的核心原因是update方法里调用了tk.Tk().after(1000,self.update)——每次执行这行代码都会新建一个Tk实例,也就是额外的空白窗口。另外代码里滥用全局变量、重复创建组件的问题也需要优化,以下是修正后的完整代码:
修正后的代码
import random import tkinter as tk class Window(tk.Frame): def __init__(self): tk.Frame.__init__(self) self.master.title("心算测验") self.master.minsize(620, 620) self.grid(sticky=tk.E+tk.W+tk.N+tk.S) top = self.winfo_toplevel() top.rowconfigure(0, weight=1) top.columnconfigure(0, weight=1) # 用实例变量替代全局变量,避免全局作用域混乱 self.score = 0 self.range_max = 10 self.timer = 0 # 初始化所有UI组件 self.question_label = tk.Label(self, text="", font=("default", 20)) self.question_label.place(x=75, y=30) self.answer_hint_label = tk.Label(self, text="", font=("default", 20)) self.answer_hint_label.place(x=75, y=100) self.answer_entry = tk.Entry(self, width=20, font=("default", 20)) self.answer_entry.place(x=75, y=490) self.answer_entry.focus_set() self.score_label = tk.Label(self, text=f"score = {self.score}", font=("default", 20)) self.score_label.place(x=75, y=540) self.timer_label = tk.Label(self, text=f"{self.timer} s", font=("default", 20)) self.timer_label.place(x=550, y=30) # 绑定回车提交事件 self.answer_entry.bind("<Return>", self.check_answer) # 生成第一道题目 self.generate_new_question() # 启动计时器循环 self.update_timer() def generate_new_question(self): # 生成随机乘法题目 self.num1 = random.randint(1, self.range_max) self.num2 = random.randint(1, self.range_max) self.question_label.config(text=f"question : {self.num1} * {self.num2}") # 清空上一题的答案提示 self.answer_hint_label.config(text="") def check_answer(self, event): user_input = self.answer_entry.get().strip() correct_answer = str(self.num1 * self.num2) if user_input != correct_answer: # 答错重置分数并显示正确答案 self.score = 0 self.answer_hint_label.config(text=f"{self.num1} * {self.num2} = {correct_answer}") else: # 答对加分 self.score += 1 # 根据分数调整题目难度范围 self.range_max = 10 ** (1 + (self.score // 10)) # 更新分数显示 self.score_label.config(text=f"score = {self.score}") # 清空输入框 self.answer_entry.delete(0, tk.END) # 重置计时器 self.timer = 0 # 生成新题目 self.generate_new_question() def update_timer(self): self.timer += 1 self.timer_label.config(text=f"{self.timer} s") # 使用当前窗口的主循环调用after,避免新建空白窗口 self.master.after(1000, self.update_timer) if __name__ == "__main__": Window().mainloop()
关键修改点说明
- 计时器修复:把
tk.Tk().after()替换为self.master.after(),复用当前窗口的主事件循环,彻底解决空白弹窗问题。 - 替换全局变量:将分数、计时器、题目数字等状态变量改为类的实例变量,代码逻辑更清晰,避免全局变量冲突。
- 组件复用优化:不再重复创建输入框和答案提示标签,而是通过
config方法更新内容,减少不必要的资源消耗。 - 逻辑拆分:单独拆分出
generate_new_question方法处理题目生成,代码结构更易维护。
内容的提问来源于stack exchange,提问作者jkbfdgb
相关产品推荐
相关产品推荐

