Python Tkinter Hangman项目:窗口切换实现及启动按钮无响应求助
问题根因与修复
- 按钮命令绑定无效
原代码写的command=lambda: spelet没有给函数添加调用括号,lambda表达式仅返回spelet函数本身,点击按钮时不会触发函数执行,这是按钮无响应的核心原因。 - 子窗口创建不符合Tkinter规则
单个Tkinter程序仅允许存在1个Tk()主根窗口,新建独立功能窗口必须使用Toplevel组件,重复调用Tk()会引发事件循环冲突、控件挂载混乱。 - 游戏控件父窗口绑定错误
spelet()函数内创建的猜词进度Label、新建游戏按钮,都错误绑定到了原开始菜单主窗口window上,没有挂载到新建的游戏窗口,就算按钮能正常触发,控件也会显示在错误位置。 - 按钮交互逻辑错位
文本为Y的按钮,触发的判定命令是guess("Z"),点击Y按钮会被识别为输入Z字母,和按钮标注不匹配。
核心代码修改点
修正开始菜单按钮的绑定逻辑
原错误写法:startaspelet = Button(window, text="Start the game", relief="solid", font=("arial", 12, "bold"), command=lambda: spelet).place(x=78, y=140)修改为:
# 直接绑定函数引用,不需要多余的lambda startaspelet = Button(window, text="Start the game", relief="solid", font=("arial", 12, "bold"), command=spelet) startaspelet.place(x=78, y=140)替换子窗口的创建方式
原错误写法:def spelet(): window2 = Tk()修改为:
def spelet(): # 使用Toplevel创建主窗口的子游戏窗口 window2 = Toplevel()修正游戏控件的父窗口指向
原错误写法:lblWord=StringVar() Label(window, textvariable=lblWord, font=("Consolas 24 bold")).grid(row=0, column=3, columnspan=6, padx=10) # ... 中间省略按键创建代码 Button(window, text="New\nGame", command=lambda:newGame(), font=("Helvetica 10 bold")).grid(row=3, column=8, sticky="NSWE")修改为:
lblWord=StringVar() # 控件绑定到游戏窗口window2而非原主窗口 Label(window2, textvariable=lblWord, font=("Consolas 24 bold")).grid(row=0, column=3, columnspan=6, padx=10) # ... 中间省略按键创建代码 Button(window2, text="New\nGame", command=lambda:newGame(), font=("Helvetica 10 bold")).grid(row=3, column=8, sticky="NSWE")修正按钮的字母关联
原错误写法:btn26 = Button(window2, text="Y",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Z"))修改为:
btn26 = Button(window2, text="Y",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Y"))
可选扩展:支持读取开始菜单输入框的自定义秘密词
修改newGame函数即可实现玩家自定义猜词:
def newGame(): global the_word_withSpaces global numberOfGuesses numberOfGuesses=0 user_word = e.get().strip().upper() # 输入非空时用玩家自定义的词,否则从词库随机选取 the_word = user_word if user_word else random.choice(word_list) the_word_withSpaces=" ".join(the_word) lblWord.set(" ".join("_"*len(the_word)))
内容的提问来源于stack exchange,提问作者Erik Eckner
相关产品推荐
相关产品推荐

