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

