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

Tkinter猜数字程序循环异常,输入数字窗口无法弹出

猜数字游戏窗口无法弹出的问题修复

问题根源

  • tkinter是事件驱动的GUI库,必须让主事件循环(mainloop())持续运行才能处理界面渲染、用户输入等事件。你的play函数里的while aktiv循环会无限执行,直接阻塞了后续的window_3.mainloop()调用,导致窗口根本没机会显示。
  • 另外,循环里反复创建新的Entry和Button,即使循环能停,也会造成界面元素重复堆积,逻辑混乱。

修复后的代码

from tkinter import *
import random

class NumberGuessingGame:
    def __init__(self):
        # 初始主窗口
        self.main_window = Tk()
        self.main_window.title("Zahlenraten")
        Label(self.main_window, text="Do you want to play with me?").grid(row=0, columnspan=2)
        Button(self.main_window, text="Yes", command=self.show_try_count_window).grid(row=1, column=0)
        Button(self.main_window, text="No", command=self.show_confirm_quit_window).grid(row=1, column=1)
        self.main_window.mainloop()

    def show_try_count_window(self):
        # 关闭主窗口
        self.main_window.destroy()
        # 创建输入尝试次数的窗口
        self.try_window = Tk()
        self.try_window.title("Zahlenraten")
        Label(self.try_window, text="Wie viele Versuche möchtest du haben?").grid(row=0, column=0)
        self.try_entry = Entry(self.try_window, width=20)
        self.try_entry.grid(row=0, column=1)
        Button(self.try_window, text="Confirm", command=self.start_game).grid(row=1, column=0)
        self.try_window.mainloop()

    def start_game(self):
        # 关闭尝试次数窗口
        self.try_window.destroy()
        # 获取尝试次数,处理非数字输入
        try:
            self.max_tries = int(self.try_entry.get())
        except ValueError:
            self.max_tries = 5
        # 初始化游戏状态
        self.current_try = 0
        self.random_num = random.randint(1, 50)
        # 创建游戏窗口
        self.game_window = Tk()
        self.game_window.title("Zahlenraten")
        # 尝试次数提示
        self.try_label = Label(self.game_window, text=f"Versuch: {self.current_try + 1}/{self.max_tries}")
        self.try_label.grid(row=0, columnspan=2)
        # 提示文本
        self.hint_label = Label(self.game_window, text="Meine Zahl liegt zwischen 1 und 50.")
        self.hint_label.grid(row=1, columnspan=2)
        # 输入区域
        Label(self.game_window, text="Gib deine Zahl ein:").grid(row=2, column=0)
        self.guess_entry = Entry(self.game_window, width=20)
        self.guess_entry.grid(row=2, column=1)
        # 确认按钮
        Button(self.game_window, text="Confirm", command=self.check_guess).grid(row=3, columnspan=2)
        self.game_window.mainloop()

    def check_guess(self):
        self.current_try += 1
        # 更新尝试次数显示
        self.try_label.config(text=f"Versuch: {self.current_try}/{self.max_tries}")
        # 获取用户输入,处理非法值
        try:
            user_guess = int(self.guess_entry.get())
        except ValueError:
            self.hint_label.config(text="Bitte gib eine gültige Zahl ein!")
            return
        # 判断猜测结果
        if user_guess == self.random_num:
            self.hint_label.config(text="Du hast gewonnen!")
            self.guess_entry.config(state=DISABLED)
        elif self.current_try >= self.max_tries:
            self.hint_label.config(text=f"Du hast alle Versuche aufgebraucht! Die Zahl war {self.random_num}")
            self.guess_entry.config(state=DISABLED)
        elif user_guess > self.random_num:
            self.hint_label.config(text="Deine Zahl ist zu groß.")
        elif user_guess < self.random_num:
            self.hint_label.config(text="Deine Zahl ist zu klein.")
        # 清空输入框
        self.guess_entry.delete(0, END)

    def show_confirm_quit_window(self):
        # 退出确认窗口
        self.quit_window = Tk()
        self.quit_window.title("Abbruch")
        Label(self.quit_window, text="Bist du dir sicher, dass du das Spiel abbrechen möchtest?").grid(row=0, columnspan=2)
        Button(self.quit_window, text="Yes", command=self.main_window.quit).grid(row=1, column=0)
        Button(self.quit_window, text="No", command=self.quit_window.destroy).grid(row=1, column=1)

if __name__ == "__main__":
    NumberGuessingGame()

关键修改说明

  • 用类封装所有游戏状态(窗口、尝试次数、随机数等),避免嵌套函数的变量作用域混乱。
  • 彻底移除阻塞事件循环的while循环,改用按钮点击事件处理每一次猜测,完全适配tkinter的事件驱动逻辑。
  • 每个窗口完成功能后调用destroy()关闭,避免多窗口并存的混乱。
  • 增加输入合法性判断,处理用户输入非数字的情况,提升程序稳定性。
  • 游戏状态保存在类实例变量中,无需每次猜测重复定义。

内容的提问来源于stack exchange,提问作者mueller.05

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:26:01