Advertisement
wjjd225

Python Hangman w/ Tkinter GUI

Dec 13th, 2015
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.89 KB | None | 0 0
  1. import tkinter as tk
  2. import random as r
  3.  
  4. #########################################################################################################################
  5. #imports the words from cars.txt and states.txt and formats them into lists
  6. infile1 = open("cars.txt","r")
  7. infile2 = open("states.txt","r")
  8.  
  9. cars = infile1.readlines()
  10. states = []
  11. for x in range(len(cars)):
  12.     cars[x] = cars[x].split(",")
  13.  
  14. cars = [item for sublist in cars for item in sublist]
  15. cars = [item.strip("\n") for item in cars]
  16.  
  17. for i in infile2:
  18.     states.append(i.strip("\n").strip(" "))
  19.    
  20. infile1.close()
  21. infile2.close()
  22.  
  23. cars.remove('Citroën')
  24. ###########################################################################################################################
  25. #chooses two words from the lists cars and states
  26. def choose_words():
  27.    
  28.     r.shuffle(cars)
  29.     r.shuffle(states)
  30.    
  31.     state = states[r.randint(0, len(states)-1)]
  32.     car = cars[r.randint(0, len(cars)-1)]
  33.     print(car)
  34.     print(state)
  35.    
  36.     return car, state
  37.  
  38. #handles the press of the exit button in the windows manager to properly break program loop
  39. def emergency_break():
  40.     global playAgain
  41.  
  42.     app.destroy()
  43.     playAgain=False
  44.  
  45. #main window of the program
  46. class mainWindow(tk.Tk):
  47.    
  48.     def __init__(self, *args, **kwargs):
  49.         tk.Tk.__init__(self, *args, **kwargs)
  50.        
  51.         window = tk.Frame(self)
  52.  
  53.         window.pack(side="top", fill="both", expand=True)
  54.  
  55.         window.grid_rowconfigure(0, weight=1)
  56.         window.grid_columnconfigure(0, weight=1)
  57.  
  58.         self.frames = {}
  59.  
  60.         for F in (start, play, gameOver):
  61.  
  62.             frame = F(window, self)
  63.  
  64.             self.frames[F] = frame
  65.  
  66.             frame.grid(row=0, column=0, sticky="nsew")
  67.  
  68.         self.show_frame(start)
  69.  
  70.     #raises the frame passed to it to the front
  71.     def show_frame(self, contr):
  72.         frame = self.frames[contr]
  73.         frame.tkraise()
  74.  
  75.     #closes the mainWindow and breaks program loop
  76.     def close_mainWindow(self, again=False):
  77.         global playAgain
  78.         if again == False:
  79.             self.destroy()
  80.             playAgain = False
  81.  
  82.         else:
  83.             self.destroy()
  84.        
  85. class start(tk.Frame):
  86.  
  87.     def __init__(self, parent, contr):
  88.         tk.Frame.__init__(self, parent)
  89.        
  90.         askStart = tk.Label(self, text="Would you like to play Hangman?", font=("Verdana", 12))
  91.         askStart.grid(row=0, column=0, sticky="n")
  92.  
  93.         buttonFrame = tk.Frame(self)
  94.         buttonFrame.grid(row=1, column=0, stick="n")
  95.  
  96.         Cars = tk.Button(buttonFrame, text="Cars", font="Verdana", command=lambda: self.play_with_word(contr,*choose_words(), useCar=True))
  97.         Cars.grid(row=1, column=0, sticky="s", padx=5, pady=10)
  98.  
  99.         Cars = tk.Button(buttonFrame, text="States", font="Verdana", command=lambda: self.play_with_word(contr,*choose_words(), useState=True))
  100.         Cars.grid(row=1, column=1, sticky="s", padx=5, pady=10)
  101.  
  102.         cancel = tk.Button(buttonFrame, text="Cancel", font="Verdana", command=lambda: contr.close_mainWindow())
  103.         cancel.grid(row=1, column=2, sticky="s", padx=5, pady=10)
  104.  
  105.     #sets the answerWord to either car or state based on user selection
  106.     #these words are selected in the choose_words function
  107.     def play_with_word(self, contr, car, state, useCar=False, useState=False):
  108.         global answerWord
  109.  
  110.         if useCar == True:
  111.             answerWord = car
  112.  
  113.         elif useState == True:
  114.             answerWord = state
  115.  
  116.         play.reveal(play, start=True)
  117.         contr.show_frame(play)        
  118.  
  119. class play(tk.Frame):
  120.  
  121.     def __init__(self, parent, contr):
  122.         tk.Frame.__init__(self, parent)
  123.         global guess, hiddenWord
  124.  
  125.         hiddenWord = tk.StringVar()
  126.         hiddenWord.trace("w", lambda name, index, mode, hiddenWord=hiddenWord: self.call_back_hiddenWord())
  127.         guess = tk.StringVar()
  128.         guess.trace("w", lambda name, index, mode, guess=guess: self.call_back_guess(guess))
  129.        
  130.         self.gameLabel = tk.Label(self, text="Hangman", font=("Verdana", 12))
  131.         self.gameLabel.grid(row=0, column=0, sticky="n", padx=10, pady=10)
  132.  
  133.         guessFrame = tk.Frame(self)
  134.         guessFrame.grid(row=1, column=0, sticky="nsew")
  135.  
  136.         guessBox = tk.Label(guessFrame, text="Guess a letter: ", font="Verdana")
  137.         guessBox.grid(row=0, column=0, sticky="w")
  138.  
  139.         self.guessEntry = tk.Entry(guessFrame,textvariable=guess)
  140.         self.guessEntry.grid(row=0, column=1, sticky="w")
  141.  
  142.         self.enterGuess = tk.Button(self, text="Guess", font="Verdana", command=lambda: self.check_guess(contr))
  143.         self.enterGuess.grid(row=2, column=0, padx=10, pady=10, sticky="n")
  144.        
  145.         self.hiddenWordBox = tk.Entry(self, textvariable=hiddenWord, font=("Verdana",10), justify='center', width=35)
  146.         self.hiddenWordBox.grid(row=3, column=0, sticky="n")
  147.  
  148.         self.guesses = tk.Text(self, font="Verdana", width=25, height=1)
  149.         self.guesses.grid(row=4, column=0, sticky="n")
  150.        
  151.         gameFrame = tk.Frame(self)
  152.         gameFrame.grid(row=5, column=0, sticky="nsew")
  153.  
  154.         self.man_images = []
  155.         self.man_images.append(tk.PhotoImage(file='image0.gif'))
  156.         self.man_images.append(tk.PhotoImage(file='image1.gif'))
  157.         self.man_images.append(tk.PhotoImage(file='image2.gif'))
  158.         self.man_images.append(tk.PhotoImage(file='image3.gif'))
  159.         self.man_images.append(tk.PhotoImage(file='image4.gif'))
  160.         self.man_images.append(tk.PhotoImage(file='image5.gif'))
  161.         self.man_images.append(tk.PhotoImage(file='image6.gif'))
  162.  
  163.         self.gameDisplay = tk.Canvas(gameFrame, width=300, height=300)
  164.         self.gameDisplay.grid(row=0, column=0, sticky="n")
  165.  
  166.         self.hangMan = self.gameDisplay.create_image(0, 0, anchor='nw', image=self.man_images[numWrong])
  167.  
  168.     #reveals the letter in hiddenWordBox widget as it corresponds to the answerWord
  169.     def reveal(self, start=False, full=False):
  170.         global hiddenWord, charList
  171.  
  172.         if start == True:
  173.             for i in answerWord:
  174.                 if i == " ":
  175.                     charList.append(" ")
  176.                 else:
  177.                     charList.append("__")
  178.             hiddenWord.set(" ".join(charList))
  179.            
  180.         elif full == True:
  181.             hiddenWord.set(answerWord)
  182.  
  183.         else:
  184.             c = guess.get()            
  185.             for i in answerWord:
  186.                 if i == c.lower():
  187.                     charList[answerWord.index(i)] = i
  188.                 elif i == c.upper():
  189.                     charList[answerWord.index(i)] = i
  190.             hiddenWord.set(" ".join(charList))
  191.  
  192.     #checks to see if guessed letter is in the answerWord
  193.     def check_guess(self, contr):
  194.         global numWrong
  195.  
  196.         g = guess.get().lower()
  197.         if numWrong < 6:
  198.             if (g in answerWord.lower()) == True:
  199.                 self.reveal()
  200.                 self.guessEntry.delete(0, 'end')
  201.  
  202.             else:
  203.                 self.guesses.insert(tk.END, g + " ")
  204.                 self.guessEntry.delete(0, 'end')
  205.                 numWrong += 1
  206.                 self.gameDisplay.itemconfig(self.hangMan, image=self.man_images[numWrong])
  207.                 if numWrong == 6:
  208.                     self.guessEntry.config(state='disabled')
  209.                     self.gameLabel.config(text="GAME OVER!")
  210.                     self.reveal(full=True)
  211.                     self.enterGuess.config(text='Continue', command=lambda: contr.show_frame(gameOver))
  212.  
  213.     #def check_word(self):    
  214.    
  215.     #prevents user from entering more than one letter into guessEntry widget
  216.     def call_back_guess(self,guess):
  217.         try:
  218.             c = guess.get()[0]
  219.             guess.set(c)
  220.         except IndexError:
  221.             pass
  222.    
  223.     #prevents user from modifying contents of hiddenWordBox    
  224.     def call_back_hiddenWord(self):
  225.         self.reveal()
  226.  
  227. class gameOver(tk.Frame):
  228.    
  229.     def __init__(self, parent, contr):
  230.         tk.Frame.__init__(self, parent)
  231.  
  232.         lossLabel = tk.Label(self, justify="center", text="GAME OVER!", font=("Verdana", 20))
  233.         lossLabel.grid(row=0, column=0, sticky="n", padx=10, pady=10)
  234.  
  235.         playAgainButtonFrame = tk.Frame(self)
  236.         playAgainButtonFrame.grid(row=1, column=0, sticky='nsew')
  237.  
  238.         acceptDefeat = tk.Button(playAgainButtonFrame, text="Quit", font="Verdana", command=lambda: contr.close_mainWindow())
  239.         acceptDefeat.grid(row=0, column=0, sticky="n", padx=10, pady=10)
  240.  
  241.         keepPlaying = tk.Button(playAgainButtonFrame, text="Play Again", font="Verdana", command=lambda: contr.close_mainWindow(again=True))
  242.         keepPlaying.grid(row=0, column=1, stick="n", padx=10, pady=10)
  243.  
  244.  
  245. playAgain = True
  246.                                
  247. while playAgain == True:
  248.     numWrong = 0
  249.     charList = []
  250.     app = mainWindow()
  251.     app.protocol('WM_DELETE_WINDOW', lambda: emergency_break())
  252.     app.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement