'Pygame drawing not showing in Pygame window

So I was testing out pygame and I wanted to draw a simple rectangle. There are no error messages when I run the code but the rectangle doesn't show up in the window. What I see is a blank white Pygame window pop up. Does anyone know why? Currently using Python3 and Pygame 1.9.4 on my mac. Here is my code,

import pygame
import pygame.font
pygame.init()

# Colours
BLACK   = (  0,  0,  0)
WHITE   = (255,255,255)
GREEN   = (  0,255,  0)
RED     = (255,  0,  0)
BLUE    = (  0,  0,255)

# Dimensions of screen
size = (400,500)
WIDTH = 500
HEIGHT = 400
screen = pygame.display.set_mode(size)

# Loop Switch
done = False

# Screen Update Speed (FPS)
clock = pygame.time.Clock()

# ------- Main Program Loop -------
while not done:
    # --- Main Event Loop ---
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    pygame.draw.rect(screen,(78,203,245),(0,0,250,500),5)


    screen.fill(GREEN)
    pygame.display.flip()

    #Setting FPS
    clock.tick(60)

#Shutdown
pygame.quit()


Solution 1:[1]

You do not want to fill the screen with green every 60 ticks

To fix this, simply put screen.fill(GREEN) outside of the Main loop.

The only time you want screen.fill inside your while loop, is when your adding movement into your program.

I strongly suggest you make a function called draw and draw things outside of your while loop.

Solution 2:[2]

I have found the problem: first of, Glitchd is correct, but you forget to update:

import pygame
import pygame.font
pygame.init()

# Colours
BLACK   = (  0,  0,  0)
WHITE   = (255,255,255)
GREEN   = (  0,255,  0)
RED     = (255,  0,  0)
BLUE    = (  0,  0,255)

# Dimensions of screen
size = (400,500)
WIDTH = 500
HEIGHT = 400
screen = pygame.display.set_mode(size)

# Loop Switch
done = False

# Screen Update Speed (FPS)
clock = pygame.time.Clock()

# ------- Main Program Loop -------
while not done:
    # --- Main Event Loop ---
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
    screen.fill(GREEN)
    pygame.draw.rect(screen,(78,203,245),(0,0,250,500),5)


    pygame.display.flip()
    pygame.display.update()

    #Setting FPS
    clock.tick(60)

#Shutdown
pygame.quit()

Solution 3:[3]

U are drawing a shape and then covering it up with green, swap

pygame.draw.rect(screen,(78,203,245),(0,0,250,500),5)
screen.fill(GREEN)

Those 2 around

Solution 4:[4]

The problem is that you draw the shape and after that you 'fill' (cover) it with green, so try something like that:

    screen.fill(GREEN) #first fill the screen with green
    pygame.draw.rect(screen,(78,203,245),(0,0,250,500),5) #and after that draw the rectangle

Solution 5:[5]

The error is obvious as first you are drawing a shape then covering it with color . Your code is right but need some rearrangement.

screen.fill("your color") # First you should fill the screen with color

pygame.draw.rect(screen,(78,203,245),(0,0,250,500),5) # Then u should draw any shape

Solution 6:[6]

Each of the previously given answers fail to properly elaborate why this issue occurs. It is not about the order of drawing, filling operations; it is about your timing on calling the pygame.display.flip function, or shortly: updating the screen. Your code draws a rectangle, fills the screen with green, and then updates the screen. What it should have done instead is draw the rectangle, update the screen and then fill the screen with green. That way the screen is updated after you draw the rectangle before the screen is filled with green, therefore you can see it:

import pygame
import pygame.font
pygame.init()

# Colours
BLACK   = (  0,  0,  0)
WHITE   = (255,255,255)
GREEN   = (  0,255,  0)
RED     = (255,  0,  0)
BLUE    = (  0,  0,255)

# Dimensions of screen
size = (400,500)
WIDTH = 500
HEIGHT = 400
screen = pygame.display.set_mode(size)

# Loop Switch
done = False

# Screen Update Speed (FPS)
clock = pygame.time.Clock()

# ------- Main Program Loop -------
while not done:
    # --- Main Event Loop ---
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    #In each case you draw the rectangle and then fill the screen with green

    pygame.draw.rect(screen,(78,203,245),(0,0,250,500),5)
    pygame.display.flip()

    screen.fill(GREEN)
    

    #Setting FPS
    clock.tick(60)

#Shutdown
pygame.quit()

In a nutshell, you should update after you draw the rectangle.

Solution 7:[7]

you should add pygame.display.update() in the while not done loop. pygame.display.update updates the screen. You have this problem because you drew all of the drawings but did not update the screen.

Solution 8:[8]

You should first cover the screen with green and then draw your shape because otherwise it will get covered.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Joe The Bro
Solution 2
Solution 3 Glitchd
Solution 4
Solution 5 Karan Mishra
Solution 6 explorer
Solution 7 Coding_Guy
Solution 8 Eero Ristolainen