You need to enable JavaScript to run this app. Python Tkinter Hangman项目:窗口切换实现及启动按钮无响应求助
优惠活动
大模型
产品
解决方案
定价
更多

Python Tkinter Hangman项目:窗口切换实现及启动按钮无响应求助

问题根因与修复
  • 按钮命令绑定无效
    原代码写的command=lambda: spelet没有给函数添加调用括号,lambda表达式仅返回spelet函数本身,点击按钮时不会触发函数执行,这是按钮无响应的核心原因。
  • 子窗口创建不符合Tkinter规则
    单个Tkinter程序仅允许存在1个Tk()主根窗口,新建独立功能窗口必须使用Toplevel组件,重复调用Tk()会引发事件循环冲突、控件挂载混乱。
  • 游戏控件父窗口绑定错误
    spelet()函数内创建的猜词进度Label、新建游戏按钮,都错误绑定到了原开始菜单主窗口window上,没有挂载到新建的游戏窗口,就算按钮能正常触发,控件也会显示在错误位置。
  • 按钮交互逻辑错位
    文本为Y的按钮,触发的判定命令是guess("Z"),点击Y按钮会被识别为输入Z字母,和按钮标注不匹配。

核心代码修改点

  1. 修正开始菜单按钮的绑定逻辑
    原错误写法:

    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)
    
  2. 替换子窗口的创建方式
    原错误写法:

    def spelet():
      window2 = Tk()
    

    修改为:

    def spelet():
      # 使用Toplevel创建主窗口的子游戏窗口
      window2 = Toplevel()
    
  3. 修正游戏控件的父窗口指向
    原错误写法:

    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")
    
  4. 修正按钮的字母关联
    原错误写法:

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 04:45:04