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

Python开发Hangman游戏:单词转下划线及大小写兼容问题求助

Hangman猜单词游戏问题解决方案

问题1:将目标单词转为下划线形式显示

你之前定义的underscoreWoord函数未被调用且逻辑有误,正确实现方式如下:

  • 在GekozenMain中新增一个StringVar专门存储下划线格式的单词
  • 绑定原单词变量的追踪事件,当原单词更新时自动生成下划线文本
  • 将标签绑定到这个新的StringVar上

具体修改点:

  1. 在GekozenMain的__init__方法中添加下划线变量:
self.underscore_var = tk.StringVar()
  1. 编写更新下划线的函数并绑定追踪:
def update_underscore(*args):
    target_word = self.controller.shared_data["gekozenWoord"].get()
    # 字母替换为下划线,非字母保留原字符,用空格分隔
    underscore_text = ' '.join(['_' if c.isalpha() else c for c in target_word])
    self.underscore_var.set(underscore_text)

# 追踪原单词变化,自动更新下划线
self.controller.shared_data["gekozenWoord"].trace_add("write", update_underscore)
  1. 修改标签绑定的变量为下划线变量:
woordLabel = tk.Label(self, textvariable=self.underscore_var, font=("futura"))

问题2:实现大小写不敏感的猜词判断

在RaadWoord方法中,将用户输入和目标单词统一转为小写(或大写)后再比较:

def RaadWoord(self):
    target_word = self.controller.shared_data["gekozenWoord"].get().lower()
    user_input = self.wentry.get().strip().lower()
    if user_input == target_word:
        tk.messagebox.showinfo("成功", "恭喜你猜对了!")
        self.AnderWoord()
    else:
        tk.messagebox.showwarning("错误", "猜错了,再试试!")
    self.wentry.delete(0, "end")

注:需导入tkinter.messagebox模块使用弹窗提示。


修改后的完整代码

import tkinter as tk
from tkinter import messagebox

class Galgje(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.shared_data = {
            "gekozenWoord": tk.StringVar()
        }

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, minsize=500,  weight=1)
        container.grid_columnconfigure(0, minsize=600, weight=1)

        self.frames = {}

        for F in (KiesMain, GekozenMain):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("KiesMain")

    def show_frame(self, page_name):
        for frame in self.frames.values():
            frame.grid_remove()
        frame = self.frames[page_name]
        frame.grid()

class KiesMain(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        label = tk.Label(self, text="Kies je woord")
        label.pack(side="top", fill="x", pady="10")
        self.woordEntry = tk.Entry(self, textvariable=self.controller.shared_data["gekozenWoord"])
        self.woordEntry.pack(pady=10)

        btnContinue = tk.Button(self, text="Ga verder", command=lambda: controller.show_frame("GekozenMain"))
        btnContinue.pack()


class GekozenMain(tk.Frame):    
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="Raad het woord!")
        label.pack(side="top", fill="x", pady=10)

        # 新增下划线格式变量
        self.underscore_var = tk.StringVar()

        # 更新下划线文本的函数
        def update_underscore(*args):
            target_word = self.controller.shared_data["gekozenWoord"].get()
            underscore_text = ' '.join(['_' if c.isalpha() else c for c in target_word])
            self.underscore_var.set(underscore_text)
        
        # 追踪原单词变化,自动更新下划线
        self.controller.shared_data["gekozenWoord"].trace_add("write", update_underscore)

        # 标签绑定下划线变量
        woordLabel = tk.Label(self, textvariable=self.underscore_var, font=("futura"))
        woordLabel.pack(side="top")


        self.wentry = tk.Entry(self)
        self.wentry.pack(pady=10)
        RaadButton = tk.Button(self, text="Gok!", command=self.RaadWoord)
        RaadButton.pack()
        NieuwWoord = tk.Button(self, text="Ander Woord", command=self.AnderWoord)
        NieuwWoord.pack()

    def RaadWoord(self):
        target_word = self.controller.shared_data["gekozenWoord"].get().lower()
        user_input = self.wentry.get().strip().lower()
        if not user_input:
            messagebox.showwarning("提示", "请输入单词!")
            return
        
        if user_input == target_word:
            messagebox.showinfo("成功", "恭喜你猜对了!")
            self.AnderWoord()
        else:
            messagebox.showwarning("错误", "猜错了,再试试!")
        self.wentry.delete(0, "end")
        
    def AnderWoord(self):
        self.refresh()
        self.controller.show_frame("KiesMain")

    def refresh(self):
        self.wentry.delete(0, "end")
        self.wentry.focus_set()

if __name__ == "__main__":
    galgbord= Galgje()
    galgbord.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:05:03