0

Im currently working on a hangman project in python using Tkinter. My program is working but I wanted to create a start menu so when you click startbutton the actual game start. But when I click start button nothing is happening. I tried using lamba function but still nothing. What am I missing or doing wrong? Thank you for your time!

from tkinter import messagebox
from tkinter import *
import random



#Setting up the window



window = Tk()
window.title("Welcome to Hangman")
window.geometry("350x250+525+200")
lblspel = Label(window, text="Hangman", font=('Arial', '16', 'bold', 'italic'), justify='center', fg='Red'
                     ).pack(side=TOP, anchor=CENTER,pady=7)

Namnlbl = Label(window, text="Write the secret word: ", font=('Arial', '11', 'bold', 'italic'), justify='center'
                     ).pack(side=TOP,pady=5 , padx=20)
e = Entry(window, font=('Arial', 12), justify='center')
e.pack(side=TOP)
startaspelet = Button(window, text="Start the game", relief="solid", font=("arial", 12, "bold"), command=lambda: spelet).place(x=78, y=140)


def spelet():
  window2 = Tk()
  window2.title("Hangman")
  window2.resizable(0, 0)
  #Words
  word_list = ['FLAMBOYANT','AMBIGUOUS','AMBIVALENT','CHARISMA']

  def newGame():
    global the_word_withSpaces
    global numberOfGuesses
    numberOfGuesses=0

    the_word=random.choice(word_list)
    the_word_withSpaces=" ".join(the_word)
    lblWord.set(" ".join("_"*len(the_word)))

  def guess(letter):
    global numberOfGuesses
    if numberOfGuesses<11:
      txt=list(the_word_withSpaces)
      guessed=list(lblWord.get())
      if the_word_withSpaces.count(letter)>0:
        for c in range(len(txt)):
          if txt[c]==letter:
            guessed[c]=letter
          lblWord.set("".join(guessed))
          if lblWord.get()==the_word_withSpaces:
            messagebox.showinfo("Hangman","You guessed it!")
            newGame()

      else:
          numberOfGuesses+=1
          if numberOfGuesses==11:
            messagebox.showwarning("Hangman","Game over")


  lblWord=StringVar()
  Label(window, textvariable=lblWord, font=("Consolas 24 bold")).grid(row=0, column=3, columnspan=6, padx=10)

  btn1 = Button(window2, text="A",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("A"))
  btn1.grid(column=1, row=1)
  btn2 = Button(window2, text="B",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("B"))
  btn2.grid(column=2, row=1)
  btn3 = Button(window2, text="C",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("C"))
  btn3.grid(column=3, row=1)
  btn4 = Button(window2, text="D",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("D"))
  btn4.grid(column=4, row=1)
  btn5 = Button(window2, text="E",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("E"))
  btn5.grid(column=5, row=1)
  btn6 = Button(window2, text="F",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("F"))
  btn6.grid(column=6, row=1)
  btn7 = Button(window2, text="G",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("G"))
  btn7.grid(column=7, row=1)

  btn9 = Button(window2, text="H",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("H"))
  btn9.grid(column=1, row=2)
  btn10 = Button(window2, text="I",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("I"))
  btn10.grid(column=2, row=2)
  btn11 = Button(window2, text="J",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("J"))
  btn11.grid(column=3, row=2)
  btn12 = Button(window2, text="K",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("K"))
  btn12.grid(column=4, row=2)
  btn13 = Button(window2, text="L",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("L"))
  btn13.grid(column=5, row=2)
  btn14 = Button(window2, text="M",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("M"))
  btn14.grid(column=6, row=2)
  btn15 = Button(window2, text="N",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("N"))
  btn15.grid(column=7, row=2)


  btn16 = Button(window2, text="O",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("O"))
  btn16.grid(column=1, row=3)
  btn17 = Button(window2, text="P",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("P"))
  btn17.grid(column=2, row=3)
  btn18 = Button(window2, text="Q",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Q"))
  btn18.grid(column=3, row=3)
  btn19 = Button(window2, text="R",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("R"))
  btn19.grid(column=4, row=3)
  btn20 = Button(window2, text="S",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("S"))
  btn20.grid(column=5, row=3)
  btn21 = Button(window2, text="T",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("T"))
  btn21.grid(column=6, row=3)
  btn22 = Button(window2, text="U",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("U"))
  btn22.grid(column=7, row=3)


  btn23 = Button(window2, text="V",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("V"))
  btn23.grid(column=1, row=4)
  btn24 = Button(window2, text="W",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("W"))
  btn24.grid(column=2, row=4)
  btn25 = Button(window2, text="X",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("X"))
  btn25.grid(column=3, row=4)
  btn26 = Button(window2, text="Y",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Z"))
  btn26.grid(column=4, row=4)
  btn27 = Button(window2, text="Å",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Å"))
  btn27.grid(column=5, row=4)
  btn28 = Button(window2, text="Ä",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Ä"))
  btn28.grid(column=6, row=4)
  btn29 = Button(window2, text="Ö",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Ö"))
  btn29.grid(column=7, row=4)

  Button(window, text="New\nGame", command=lambda:newGame(), font=("Helvetica 10 bold")).grid(row=3, column=8, sticky="NSWE")

  newGame()

window.mainloop()

1 Answers1

0

Try this:

from tkinter import messagebox
from tkinter import *
import random

import string
from functools import partial


def newGame():
    global word_with_spaces
    global number_of_guesses
    number_of_guesses = 0

    the_word = random.choice(word_list)
    word_with_spaces = " ".join(the_word)
    lbl_word.set(" ".join("_"*len(the_word)))

def guess(letter):
    char_buttons[letter].config(state="disabled")
    global number_of_guesses
    if number_of_guesses < 11:
      txt = list(word_with_spaces)
      guessed = list(lbl_word.get())
      if word_with_spaces.count(letter) > 0:
        for c in range(len(txt)):
          if txt[c] == letter:
            guessed[c] = letter
          lbl_word.set("".join(guessed))
          if lbl_word.get() == word_with_spaces:
            messagebox.showinfo("Hangman", "You guessed it!")
            newGame()
      else:
          number_of_guesses += 1
          if number_of_guesses == 11:
            messagebox.showwarning("Hangman", "Game over")


def spelet():
    global window2, word_list, lbl_word, char_buttons
    window2 = Tk()
    window2.title("Hangman")
    window2.resizable(False, False)
    # Words
    word_list = ["FLAMBOYANT", "AMBIGUOUS", "AMBIVALENT", "CHARISMA"]


    lbl_word = StringVar(master=window2)
    label = Label(window2, textvariable=lbl_word, font=("Consolas 24 bold"))
    label.grid(row=0, column=1, columnspan=7, padx=10)

    all_characters = list(string.ascii_uppercase)
    all_characters.remove("Z") # I have no idea why you're missing "Z"
    all_characters.extend(("Å", "Ä", "Ö"))

    char_buttons = {}

    for i, char in enumerate(all_characters):
        command = partial(guess, char)
        button = Button(window2, text=char, bg="skyBlue", fg="Black", width=3,
                        height=1, font=("Helvetica", "20"), command=command)
        row = i//7 + 1
        column = i%7 + 1
        button.grid(row=row, column=column)

        char_buttons.update({char: button})

    button = Button(window2, text="New\nGame", command=newGame,
                  font=("Helvetica 10 bold"))
    button.grid(row=3, column=8, sticky="NSWE")

    newGame()


#Setting up the window
window = Tk()
window.title("Welcome to Hangman")
window.geometry("350x250+525+200")
# Create the "Hangman" label
lblspel = Label(window, text="Hangman", font=("Arial", "16", "bold", "italic"),
                fg="red")
lblspel.pack(side="top", anchor="center", pady=7)

# Create the entry label
Namnlbl = Label(window, text="Write the secret word: ",
                font=("Arial", "11", "bold", "italic"))
Namnlbl.pack(side="top", pady=5, padx=20)

# Create the actual entry
e = Entry(window, font=("Arial", 12), justify="center")
e.pack(side="top")

startaspelet = Button(window, text="Start the game", relief="solid",
                      font=("arial", 12, "bold"), command=spelet)
# Please don't mix geometry managers. If you want to use `.pack`, use `.pack`.
# Don't mix it with `.place`
startaspelet.place(x=78, y=140)
window.mainloop()

There where a few of things wrong with your code:

  • Why didn't you use a for loop for the button creation? Its much simpler. For the documentation for functools.partial is here
  • In python it's conventional to declare the functions first then run the code. Also please avoid defining functions inside other functions.
  • Avoid mixing geometry managers like .pack, .grid and .place in the same window/frame
  • You must always pass in a master parameter when you have StringVar/IntVar/... if you have more than 1 Tk()
  • In many cases you had var = <tkinter Widget>(...).pack(...) but when you do that the var would be None for more info read this
  • Most people use 4 spaces for indentation (you used 2) - mostly preference
  • It's also conventional use variable names like "foo_bar" instead of "fooBar" (but that's mostly preference)
TheLizzard
  • 7,248
  • 2
  • 11
  • 31
  • Thank you for your time. It's working now and I will defenetely look over your suggestions for future coding. Have a great day! – Erik Eckner Mar 28 '21 at 17:53