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

Python Tkinter猜数字游戏尝试次数显示异常问题排查

问题排查结果

你最初判断的变量作用域问题是诱因之一,但不是唯一的bug,实际导致「第一次提交就显示剩余0次」的核心问题有3个:

  • attempts变量定义在onSubmit()函数内部,每次点击提交按钮触发回调时,都会把尝试次数重新初始化为3,完全无法保留上一次猜测后的剩余次数
  • 回调函数内错误使用了while attempts != 0循环:Tkinter是事件驱动框架,点击一次提交按钮只会触发一次猜测判断,你在循环里没有重新读取用户的新输入,第一次猜错后会直接在单次回调里把次数从2循环减到0,根本不会等待用户输入下一个数字
  • continue语句写在了「次数耗尽提示」逻辑的前面,这部分代码永远不会被执行,属于无效死代码
关键修复点
  • 将attempts、目标随机数定义为全局变量,在onSubmit()内用global关键字声明,避免每次触发回调重置次数
  • 删除回调内多余的while循环,每次点击提交只做一次猜测校验、扣减一次次数
  • 移除无效的continue语句,把次数耗尽的提示逻辑放到正确的执行分支
  • 额外优化:提前创建剩余次数、提示信息的Label组件,每次更新时直接修改文本属性,避免重复创建组件导致文字叠层,同时增加了输入合法性校验,用户输入非数字时不会直接崩溃
修复后可运行代码
import random
from tkinter import *

# 全局初始化游戏参数
random_number = random.randint(0, 999)
attempts = 3

root = Tk()
root.geometry('500x500')
root.title("Number guessing game")
label_0 = Label(root, text="Number guessing game", width=20, font=("bold", 20))
label_0.place(x=90, y=53)

# 提前创建通用提示组件,避免重复生成叠层
label_attempt = Label(root, width=20, font=("bold", 20))
label_attempt.place(x=90, y=100)
label_msg = Label(root, width=50, font=("bold", 10))
label_msg.place(x=80, y=200)

label_1 = Label(root, text="Enter number", width=20, font=("bold", 10))
label_1.place(x=80, y=150)
entry_1 = Entry(root)
entry_1.place(x=240, y=150)


def printAttempts(_attempts):
    label_attempt.config(text=f"Attempt left: {_attempts}")

# 初始化显示剩余次数
printAttempts(attempts)


def printMessage(msg):
    label_msg.config(text=msg)


def onSubmit():
    global attempts, random_number
    # 次数耗尽后不再处理输入
    if attempts <= 0:
        printMessage("No attempts left, please restart the game to try again")
        return
    # 校验输入合法性
    try:
        guessed_number = int(entry_1.get())
    except ValueError:
        printMessage("Please enter a valid integer between 0 and 999")
        return
    # 清空输入框方便下次输入
    entry_1.delete(0, END)

    # 猜中逻辑
    if guessed_number == random_number:
        printMessage("Hooray you just got it Right!")
        attempts = 0
        printAttempts(attempts)
        return
    
    # 猜错逻辑
    attempts -= 1
    if guessed_number > random_number:
        printMessage("Wrong! Your guess is greater than the lucky number")
    else:
        printMessage("Wrong! Your guess is less than the lucky number")
    printAttempts(attempts)

    # 次数耗尽提示
    if attempts == 0:
        printMessage(f"No attempts left! The correct number is {random_number}, you can restart to play again")


Button(root, text='Submit', width=20, bg='brown', fg='white',
       command=onSubmit).place(x=180, y=380)

root.mainloop()

内容的提问来源于stack exchange,提问作者Dua Tariq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:51:27