Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Closing before complete
#1
Hi All,

This code is supposed to have the computer pick a number, the player has 3 lives to guess the number, and when they run out of lives the game ends. I am trying to represent the lives through pictures of hearts. The removal of heart_3 and heart_2 works, however when it gets to heart_1 and it goes to remove that it doesn't remove it and wait the 3000ms (3seconds) it just closes the window straight away. Why is this?

I will try and make all the functions into one but it is this for now.

import tkinter as tk
from tkinter import *
import random
import time
from PIL import ImageTk,Image


window_4 = tk.Tk()

window_4.title("Game")

random_num = random.randint(1, 9)
print(random_num)
button_clicked=1
print (button_clicked)
player_choice = 0
global lives
lives = 3
print ("You are starting with " + str(lives) + " lives")

def click_1():

    global lives
    player_choice=1
    if player_choice == random_num:
        print("Correct Guess - Well Done")
        window_4.after(3000)
        print ("You had " + str(lives) + " lives left")
        window_4.after(3000)
        print("The game will now terminate")
        window_4.after(3000, window_4.destroy())
    else:
        lives = lives - 1
        if lives == 2:
            heart_3.grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 1:
            heart_2 .grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 0:
            heart_1.grid_forget()
            print ("GAME OVER, you have run out of your 3 lives! - Thanks for playing")
            window_4.after(3000, window_4.destroy())

def click_2():

    global lives
    player_choice=2
    if player_choice == random_num:
        print("Correct Guess - Well Done")
        window_4.after(3000)
        print ("You had " + str(lives) + " lives left")
        window_4.after(3000)
        print("The game will now terminate")
        window_4.after(3000, window_4.destroy())
    else:
        lives = lives - 1
        if lives == 2:
            heart_3.grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 1:
            heart_2 .grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 0:
            heart_1.grid_forget()
            print ("GAME OVER, you have run out of your 3 lives! - Thanks for playing")
            window_4.after(3000, window_4.destroy())

def click_3():

    global lives
    player_choice=3
    if player_choice == random_num:
        print("Correct Guess - Well Done")
        window_4.after(3000)
        print ("You had " + str(lives) + " lives left")
        window_4.after(3000)
        print("The game will now terminate")
        window_4.after(3000, window_4.destroy())
    else:
        lives = lives - 1
        if lives == 2:
            heart_3.grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 1:
            heart_2 .grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 0:
            heart_1.grid_forget()
            print ("GAME OVER, you have run out of your 3 lives! - Thanks for playing")
            window_4.after(3000, window_4.destroy())

def click_4():

    global lives
    player_choice=4
    if player_choice == random_num:
        print("Correct Guess - Well Done")
        window_4.after(3000)
        print ("You had " + str(lives) + " lives left")
        window_4.after(3000)
        print("The game will now terminate")
        window_4.after(3000, window_4.destroy())
    else:
        lives = lives - 1
        if lives == 2:
            heart_3.grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 1:
            heart_2 .grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 0:
            heart_1.grid_forget()
            print ("GAME OVER, you have run out of your 3 lives! - Thanks for playing")
            window_4.after(3000, window_4.destroy())

def click_5():

    global lives
    player_choice=5
    if player_choice == random_num:
        print("Correct Guess - Well Done")
        window_4.after(3000)
        print ("You had " + str(lives) + " lives left")
        window_4.after(3000)
        print("The game will now terminate")
        window_4.after(3000, window_4.destroy())
    else:
        lives = lives - 1
        if lives == 2:
            heart_3.grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 1:
            heart_2 .grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 0:
            heart_1.grid_forget()
            print ("GAME OVER, you have run out of your 3 lives! - Thanks for playing")
            window_4.after(3000, window_4.destroy())
            
def click_6():

    global lives
    player_choice=6
    if player_choice == random_num:
        print("Correct Guess - Well Done")
        window_4.after(3000)
        print ("You had " + str(lives) + " lives left")
        window_4.after(3000)
        print("The game will now terminate")
        window_4.after(3000, window_4.destroy())
    else:
        lives = lives - 1
        if lives == 2:
            heart_3.grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 1:
            heart_2 .grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 0:
            heart_1.grid_forget()
            print ("GAME OVER, you have run out of your 3 lives! - Thanks for playing")
            window_4.after(3000, window_4.destroy())

def click_7():

    global lives
    player_choice=7
    if player_choice == random_num:
        print("Correct Guess - Well Done")
        window_4.after(3000)
        print ("You had " + str(lives) + " lives left")
        window_4.after(3000)
        print("The game will now terminate")
        window_4.after(3000, window_4.destroy())
    else:
        lives = lives - 1
        if lives == 2:
            heart_3.grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 1:
            heart_2 .grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 0:
            heart_1.grid_forget()
            print ("GAME OVER, you have run out of your 3 lives! - Thanks for playing")
            window_4.after(3000, window_4.destroy())

def click_8():

    global lives
    player_choice=8
    if player_choice == random_num:
        print("Correct Guess - Well Done")
        window_4.after(3000)
        print ("You had " + str(lives) + " lives left")
        window_4.after(3000)
        print("The game will now terminate")
        window_4.after(3000, window_4.destroy())
    else:
        lives = lives - 1
        if lives == 2:
            heart_3.grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 1:
            heart_2 .grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 0:
            heart_1.grid_forget()
            print ("GAME OVER, you have run out of your 3 lives! - Thanks for playing")
            window_4.after(3000, window_4.destroy())
            
def click_9():

    global lives
    player_choice=9
    if player_choice == random_num:
        print("Correct Guess - Well Done")
        window_4.after(3000)
        print ("You had " + str(lives) + " lives left")
        window_4.after(3000)
        print("The game will now terminate")
        window_4.after(3000, window_4.destroy())
    else:
        button_clicked=9
        print(button_clicked)
        lives = lives - 1
        if lives == 2:
            heart_3.grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 1:
            heart_2 .grid_forget()
            print ("You have " + str(lives) + " lives left")
        elif lives == 0:
            heart_1.grid_forget()
            print ("GAME OVER, you have run out of your 3 lives! - Thanks for playing")
            window_4.after(3000, window_4.destroy())
    
label_instructions = tk.Label(text="The computer has chosen a number, your job is to correctly guess the number. You only have 3 tries, Good Luck!")
label_instructions.grid(row=0, column = 2)

game_button_1 = tk.Button(text="1", height=1, width=2, command=click_1)
game_button_1.grid(row=1, column = 1)

game_button_2 = tk.Button(text="2", height=1, width=2, command=click_2)
game_button_2.grid(row=1, column = 3)

game_button_3 = tk.Button(text="3", height=1, width=2, command=click_3)
game_button_3.grid(row=1, column = 5)

clear_label_1=tk.Label(text=" ")
clear_label_1.grid(row=2, column=1)

game_button_4 = tk.Button(text="4", height=1, width=2, command=click_4)
game_button_4.grid(row=3, column = 1)

game_button_5 = tk.Button(text="5", height=1, width=2, command=click_5)
game_button_5.grid(row=3, column = 3)

game_button_6 = tk.Button(text="6", height=1, width=2, command=click_6)
game_button_6.grid(row=3, column = 5)

clear_label_2=tk.Label(text=" ")
clear_label_2.grid(row=4, column=1)

game_button_7 = tk.Button(text="7", height=1, width=2, command=click_7)
game_button_7.grid(row=5, column = 1)

game_button_8 = tk.Button(text="8", height=1, width=2, command=click_8)
game_button_8.grid(row=5, column = 3)

game_button_9 = tk.Button(text="9", height=1, width=2, command=click_9)
game_button_9.grid(row=5, column = 5)


heart_1 = Canvas(window_4, width = 300, height = 300)  
heart_1.grid(row=6, column=2)
img_1 = ImageTk.PhotoImage(Image.open("D:\Work\School\ComputerScience\Code\Other\pic_1.png"))  
heart_1.create_image(20, 20, anchor=NW, image=img_1) 

heart_2 = Canvas(window_4, width = 300, height = 300)  
heart_2.grid(row=6, column=3)
img_2 = ImageTk.PhotoImage(Image.open("D:\Work\School\ComputerScience\Code\Other\pic_2.png"))  
heart_2.create_image(20, 20, anchor=NW, image=img_2)

heart_3 = Canvas(window_4, width = 300, height = 300)  
heart_3.grid(row=6, column=4)
img_3 = ImageTk.PhotoImage(Image.open("D:\Work\School\ComputerScience\Code\Other\pic_3.png"))  
heart_3.create_image(20, 20, anchor=NW, image=img_3) 

window_4.mainloop()
Reply
#2
You need to remove the parentheses from window_4.destroy like this:

window_4.after(3000, window_4.destroy)
Then it will do what you want.
nilamo likes this post
Reply
#3
(Mar-05-2021, 12:42 AM)BashBedlam Wrote: You need to remove the parentheses from window_4.destroy like this:

window_4.after(3000, window_4.destroy)
Then it will do what you want.

Yep! that works than you
nilamo likes this post
Reply
#4
Do you understand why though?

When you write destroy(), you're calling that function right there and then and its return value gets passed to after. Without the parens, you're not calling the function, you're just passing that object to after for it to call it. If you think about it, that makes sense, doesn't it? after's job is to execute the thing you want to do after the time has passed, so you pass it the thing to do (i.e. the function), rather than calling it yourself.
BashBedlam, finndude, nilamo like this post
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020