Python Forum

Full Version: Closing before complete
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
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()
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.
(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
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.