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

Python 2.7 Tkinter猜数字游戏:点击OK后MessageBox无法消失求助

解决Tkinter猜数字游戏弹窗无法关闭的问题

嘿,我一眼就看出问题所在了——你用了阻塞式的while循环,把Tkinter的主事件循环给卡死了!

问题根源

Tkinter是单线程框架,所有界面交互(比如弹窗的关闭按钮响应、按钮点击事件)都依赖它的主事件循环(也就是最后要调用的root.mainloop())来处理。你代码里的while G == True是个无限循环,程序会一直陷在这个循环里,根本没机会去处理弹窗的关闭事件,所以点击OK后弹窗就僵住不动了。

修复后的代码

我们得把阻塞的循环改成Tkinter友好的方式,用函数回调来处理每次猜数字的逻辑,这样就不会阻塞主事件循环了:

import random
import Tkinter
import tkMessageBox
import tkSimpleDialog

def init_game():
    # 初始化游戏参数
    global random_num, try_count
    random_num = random.randint(1, 10)
    try_count = 0
    prompt_guess()

def prompt_guess():
    global try_count, random_num
    # 弹出输入框让用户猜数字
    guess = tkSimpleDialog.askinteger('猜数字游戏', '请输入1到10之间的数字:')
    
    # 用户点击取消,直接退出当前流程
    if guess is None:
        return
    
    try_count += 1
    guess = int(guess)
    
    # 判断猜的结果
    if guess == random_num:
        tkMessageBox.showinfo('恭喜!', f'你用了{try_count}次就猜对啦!')
        # 询问是否重玩
        if tkMessageBox.askyesno('再来一局?', '要不要再玩一次?'):
            init_game()
        else:
            root.quit()
    elif guess < random_num:
        tkMessageBox.showinfo('提示', '猜小啦,再试试!')
        prompt_guess()  # 继续让用户猜
    else:
        tkMessageBox.showinfo('提示', '猜大啦,再试试!')
        prompt_guess()  # 继续让用户猜

# 创建主窗口并隐藏(我们只用弹窗)
root = Tkinter.Tk()
root.withdraw()

# 启动游戏
init_game()

# 启动主事件循环
root.mainloop()

核心改进说明

  • 删掉了阻塞的while循环,改用递归调用prompt_guess()来实现多次猜数字的逻辑,这样每次弹窗操作完成后,程序会回到主事件循环处理界面事件,弹窗就能正常关闭了。
  • 用root.withdraw()隐藏了主窗口,因为这个游戏只用弹窗就足够了,界面更干净。
  • 增加了用户点击“取消”的处理,避免程序卡住。
  • 加入了游戏结束后的重玩选项,体验更好。

重要提醒

在Tkinter开发中,绝对不要用无限循环阻塞主事件循环。所有需要重复执行的逻辑,要么像这样用回调函数递归调用,要么用root.after(毫秒数, 回调函数)来定时触发,这样才能保证界面交互正常响应。

内容的提问来源于stack exchange,提问作者Ethan Rankin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:35:35