You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:12:47