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

Tkinter窗口关闭与新窗口打开实现方案咨询

实现分步窗口的Hangman游戏最佳方案

用面向对象封装独立窗口是这个需求的最优实现方式,相比把所有逻辑塞到单个函数里,这种方式职责清晰、代码易维护,后续扩展游戏功能也更方便。下面是完整的实现示例:

import tkinter as tk
from tkinter import messagebox

class SecretWordInput(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("输入秘密单词")
        self.geometry("300x150")
        self.resizable(False, False)

        # 输入框布局
        self.label = tk.Label(self, text="请输入秘密单词(仅字母):")
        self.label.pack(pady=10)

        self.word_entry = tk.Entry(self, width=20, font=("Arial", 12))
        self.word_entry.pack(pady=5)
        self.word_entry.focus()

        # 确认按钮
        self.confirm_btn = tk.Button(self, text="开始游戏", command=self.start_game)
        self.confirm_btn.pack(pady=10)

    def start_game(self):
        secret_word = self.word_entry.get().strip().lower()
        # 输入验证
        if not secret_word.isalpha():
            messagebox.showerror("错误", "请输入仅包含字母的单词!")
            return
        if len(secret_word) < 2:
            messagebox.showerror("错误", "单词长度不能小于2!")
            return
        
        # 关闭当前输入窗口,启动游戏窗口
        self.destroy()
        game_window = GameWindow(secret_word)
        game_window.mainloop()

class GameWindow(tk.Tk):
    def __init__(self, secret_word):
        super().__init__()
        self.title("Hangman 猜单词游戏")
        self.geometry("400x300")
        self.resizable(False, False)

        self.secret_word = secret_word
        self.guessed_letters = set()
        self.remaining_attempts = 6

        # 游戏状态显示
        self.word_display = tk.Label(self, text=self.get_display_word(), font=("Arial", 18))
        self.word_display.pack(pady=20)

        self.attempts_label = tk.Label(self, text=f"剩余次数:{self.remaining_attempts}", font=("Arial", 12))
        self.attempts_label.pack(pady=5)

        # 猜字母输入
        self.letter_entry = tk.Entry(self, width=5, font=("Arial", 12))
        self.letter_entry.pack(pady=5)
        self.letter_entry.bind("<Return>", self.guess_letter)

        self.guess_btn = tk.Button(self, text="猜字母", command=self.guess_letter)
        self.guess_btn.pack(pady=10)

        # 结果提示
        self.result_label = tk.Label(self, text="", font=("Arial", 12), fg="red")
        self.result_label.pack(pady=5)

    def get_display_word(self):
        # 生成带下划线的显示字符串
        return " ".join([letter if letter in self.guessed_letters else "_" for letter in self.secret_word])

    def guess_letter(self, event=None):
        letter = self.letter_entry.get().strip().lower()
        self.letter_entry.delete(0, tk.END)

        # 输入验证
        if not letter.isalpha() or len(letter) != 1:
            self.result_label.config(text="请输入单个字母!")
            return
        if letter in self.guessed_letters:
            self.result_label.config(text="这个字母已经猜过了!")
            return

        self.guessed_letters.add(letter)
        if letter not in self.secret_word:
            self.remaining_attempts -= 1
            self.attempts_label.config(text=f"剩余次数:{self.remaining_attempts}")

        # 更新显示
        self.word_display.config(text=self.get_display_word())

        # 检查游戏结束条件
        if set(self.secret_word).issubset(self.guessed_letters):
            self.result_label.config(text=f"恭喜你猜对了!单词是:{self.secret_word}", fg="green")
            self.disable_input()
        elif self.remaining_attempts == 0:
            self.result_label.config(text=f"游戏结束!正确单词是:{self.secret_word}", fg="red")
            self.disable_input()
        else:
            self.result_label.config(text="")

    def disable_input(self):
        # 游戏结束后禁用输入和按钮
        self.letter_entry.config(state=tk.DISABLED)
        self.guess_btn.config(state=tk.DISABLED)

if __name__ == "__main__":
    input_window = SecretWordInput()
    input_window.mainloop()

关键实现说明

  • 职责分离:用两个类分别封装「秘密单词输入」和「游戏运行」的逻辑,每个类只负责自己的功能,代码结构清晰。
  • 窗口切换逻辑:在输入窗口的确认按钮回调中,先验证输入合法性,然后销毁当前窗口,再实例化游戏窗口并启动其主循环,避免多个窗口同时运行的问题。
  • 输入验证:在两个窗口都加入了输入合法性检查,避免无效输入导致游戏出错。
  • 游戏状态管理:游戏窗口内部维护秘密单词、已猜字母、剩余次数等状态,逻辑内聚,便于后续扩展(比如添加图形化的Hangman小人、单词库等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:54:12