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

为何Tkinter输入框内容无法转为int类型?猜数字游戏报错求助

问题排查与代码修正

核心错误分析

  1. 玩家输入处理错误:
    你在reponse()函数里写了player_reponse = int(),这行代码不是将输入内容转为整数,而是创建了一个默认值为0的新整数对象。所以不管玩家输入什么,player_reponse始终是0,而随机数nb是1-10之间的数,0永远小于nb,所以每次都会提示“数字更大”。
    正确的写法应该是player_reponse = int(player_reponse),同时要添加异常处理,防止玩家输入非数字内容导致程序崩溃。

  2. 随机数重复生成:
    每次点击“Valider”按钮时,nb = randint(1, 10)都会重新生成一个随机数,意味着玩家每次猜测的都是新的目标数字,几乎不可能猜对。应该把随机数的生成移到游戏开始时(比如starting()函数中),全局保存这个目标数字。

  3. 条件判断逻辑冗余:
    三个独立的if判断可能导致多个提示框同时出现(虽然当前逻辑不会,但改为elif更严谨,符合互斥条件的判断逻辑)。

修正后的完整代码

from tkinter import *
from random import randint

window = Tk()
# 统一窗口大小设置,避免重复覆盖
window.minsize(600, 500)
window.maxsize(600, 500)
window.title("Jeu de hasard")
window["bg"] = "grey"

# 全局变量存储目标数字
target_number = None

def starting():
    global target_number
    # 游戏开始时生成唯一的目标数字
    target_number = randint(1, 10)
    text_1 = Label(window, text="Choisis un nombre entre 1 et 10.", font=("Verdana", 15, "italic bold"), bg="grey", fg="white")
    text_1.place(x=10, y=100)
    # 清空输入框,方便玩家输入
    champs_de_saisie.delete(0, END)

def reponse():
    global target_number
    # 先判断游戏是否已开始
    if target_number is None:
        prompt_text = Label(window, text="先点击'Commencer'开始游戏!", font=("Verdana", 12, "italic bold"), bg="grey", fg="orange")
        prompt_text.place(x=10, y=130)
        prompt_text.after(3000, prompt_text.destroy)
        return
    
    player_input = champs_de_saisie.get().strip()
    duration = 3000
    
    # 处理非数字输入
    if not player_input.isdigit():
        error_text = Label(window, text="请输入1-10之间的数字!", font=("Verdana", 12, "italic bold"), bg="grey", fg="red")
        error_text.place(x=10, y=130)
        error_text.after(duration, error_text.destroy)
        champs_de_saisie.delete(0, END)
        return
    
    player_reponse = int(player_input)
    # 判断输入是否在1-10范围内
    if player_reponse < 1 or player_reponse > 10:
        range_text = Label(window, text="数字必须在1到10之间!", font=("Verdana", 12, "italic bold"), bg="grey", fg="orange")
        range_text.place(x=10, y=130)
        range_text.after(duration, range_text.destroy)
        champs_de_saisie.delete(0, END)
        return
    
    # 用elif优化条件判断
    if player_reponse < target_number:
        loose_text_1 = Label(window, text="Dommage, réessaie, le nombre est plus grand.", font=("Verdana", 15, "italic bold"), bg="grey", fg="white")
        loose_text_1.place(x=10, y=130)
        loose_text_1.after(duration, loose_text_1.destroy)
    elif player_reponse > target_number:
        loose_text_2 = Label(window, text="Dommage, réessaie, le nombre est plus petit.", font=("Verdana", 15, "italic bold"),bg="grey", fg="white")
        loose_text_2.place(x=10, y=130)
        loose_text_2.after(duration, loose_text_2.destroy)
    else:
        win_text = Label(window, text="Bravo, tu as gagné !", font=("Verdana", 15, "italic bold"),bg="grey", fg="white")
        win_text.place(x=10, y=130)
        win_text.after(duration, win_text.destroy)
        # 猜对后可以重置游戏
        target_number = None
    
champs_de_saisie = Entry(window, bg="white", font="Arial 12", width=15)
champs_de_saisie.place(x=400, y=245)

lbl = Label(window, text="Saisis ici :", font="Arial 12", bg="grey", fg="white")
lbl.place(x=430, y=215)

start_button = Button(window, text="Commencer", bg="blue", fg="white", font="Arial 15", width=27, command=starting)
start_button.place(x=0, y=0)

valid_button = Button(window, text="Valider", bg="green", command=reponse)
valid_button.place(x=445, y=275)

leave_button = Button(window, text="Quitter", bg="red", fg="white", font="Arial 15", width=27, command=window.destroy)
leave_button.place(x=300, y=0)

window.mainloop()

额外优化点

  • 添加了游戏未开始时的提示,避免玩家直接点击“Valider”无反应
  • 增加了输入合法性校验(非数字、超出范围的情况)
  • 猜对后自动重置目标数字,方便玩家重新开始游戏
  • 移除了不必要的初始输入框清空操作
  • 统一了窗口大小的设置逻辑

内容的提问来源于stack exchange,提问作者William Locufier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:53:12