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
相关产品推荐
相关产品推荐

