Python开发Hangman游戏:单词转下划线及大小写兼容问题求助
Hangman猜单词游戏问题解决方案
问题1:将目标单词转为下划线形式显示
你之前定义的underscoreWoord函数未被调用且逻辑有误,正确实现方式如下:
- 在
GekozenMain中新增一个StringVar专门存储下划线格式的单词 - 绑定原单词变量的追踪事件,当原单词更新时自动生成下划线文本
- 将标签绑定到这个新的
StringVar上
具体修改点:
- 在
GekozenMain的__init__方法中添加下划线变量:
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"))
问题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
相关产品推荐
相关产品推荐

