Handouts: Graphics Reference

We are going to create 1000 circles in random positions on the screen. Circles closer to the bottom-left corner will be blue and circles closer to the top-right corner will be green. This is an example of return values.


  • Each circle is 20 pixels by 20 pixels.

  • Note every circle is drawn fully on the canvas.

  • The time.sleep(0.002) function call waits 2 milliseconds between drawing circles.

Solution

"""
File: half_green.py
-------------------
Draws circles randomly, where circles in the top-right half are green
and circles in the bottom-left half are blue.
"""

from graphics import Canvas
import random
import time

# The size of the canvas
CANVAS_WIDTH = 500
CANVAS_HEIGHT = 500

# The diameter of each circle
CIRCLE_SIZE = 20

# The number of circles to draw
NUM_CIRCLES = 1000


def main():
    canvas = Canvas(CANVAS_WIDTH, CANVAS_HEIGHT)
    canvas.set_canvas_title("Half Green")

    # Draw 1000
    for i in range(NUM_CIRCLES):
        x = random.randint(0, canvas.get_canvas_width() - CIRCLE_SIZE)
        y = random.randint(0, canvas.get_canvas_height() - CIRCLE_SIZE)

        circle = canvas.create_oval(x, y, x + CIRCLE_SIZE, y + CIRCLE_SIZE)

        # Set both the fill and outline color to be either green or blue
        canvas.set_color(circle, get_color(x, y))

        canvas.update()
        time.sleep(0.002)

    canvas.mainloop()


def get_color(x, y):
    """
    Returns the name of the color the circle with top-left coordinate (x, y)
    should have.  Since (0, 0) is the top-left corner of the canvas, x increases
    as we go to the right, and y increases as we go down.  So the line y = x is
    the diagonal line from top-left to bottom right.  If y < x, the dot is above
    this line (in the top-right corner), so it's green.  If y >= x, the dot is at
    or below this line (in the bottom-left corner, so it's blue.
    """
    if x > y:
        return "green"
    return "blue"


if __name__ == "__main__":
    main()