Handouts: Graphics Reference

Write a program that draws this picture. You should use the constants provided, but feel free to change them (or recolor any part of the face).

FACE_WIDTH = 300      # The width of the robot face
FACE_HEIGHT = 350     # The height of the robot face
EYE_DIAMETER = 70     # The diameter of each robot eye
EYE_Y_OFFSET = 40     # The distance from the top of the head to the top of the eyes
EYE_X_SEPARATION = 40 # The distance between the left eye and right eye
MOUTH_WIDTH = 150     # The width of the mouth
MOUTH_HEIGHT = 30     # The height of the mouth
MOUTH_Y_OFFSET = 200   # The distance from the top of the head to the top of the mouth
LABEL_Y = 40          # The distance from the top of the screen to the center of the text


## Solution

"""
File: robot_face.py
-------------------
Draws an awesome robot face with eyes and a mouth, using functions.
It also includes the text "Robot Face" at the top of the window.
"""

from graphics import Canvas

# The dimensions of the robot face
FACE_WIDTH = 300
FACE_HEIGHT = 350

# The diameter of each robot eye
EYE_DIAMETER = 70

# The distance from the top of the head to the top of the eyes
EYE_Y_OFFSET = 40

# The distance between the left eye and right eye
EYE_X_SEPARATION = 40

# The dimensions of the robot mouth
MOUTH_WIDTH = 150
MOUTH_HEIGHT = 30

# The distance from the top of the head to the top of the mouth
MOUTH_Y_OFFSET = 200

# The distance from the top of the screen to the center of the text
LABEL_Y = 40

def main():
canvas = Canvas()
canvas.set_canvas_title("Robot Face")

draw_mouth(canvas)
draw_eyes(canvas)
draw_label(canvas)

canvas.mainloop()

"""
Draws a yellow rectangle in the center of the screen representing the head
for the robot.
"""
x = (canvas.get_canvas_width() - FACE_WIDTH) / 2
y = (canvas.get_canvas_height() - FACE_HEIGHT) / 2
head = canvas.create_rectangle(x, y, x + FACE_WIDTH, y + FACE_HEIGHT)

def draw_mouth(canvas):
"""
Draws the mouth as a black rectangle at the appropriate offset from the top of the face,
centered horizontally.
"""
head_x = (canvas.get_canvas_width() - FACE_WIDTH) / 2
head_y = (canvas.get_canvas_height() - FACE_HEIGHT) / 2

mouth_x = head_x + (FACE_WIDTH - MOUTH_WIDTH) / 2

# mouth offset is from top of the head

mouth = canvas.create_rectangle(mouth_x, mouth_y,
mouth_x + MOUTH_WIDTH, mouth_y + MOUTH_HEIGHT)
canvas.set_fill_color(mouth, "black")

def draw_eyes(canvas):
"""
Draws both eyes as filled ovals at the appropriate offset from the top of the face,
centered horizontally and spaced apart according to EYE_X_SEPARATION.
"""
head_y = (canvas.get_canvas_height() - FACE_HEIGHT) / 2

# eye offset is from the top of the head

eye_x = canvas.get_canvas_width() / 2 - EYE_X_SEPARATION / 2 - EYE_DIAMETER
draw_eye(canvas, eye_x, eye_y, "blue")

eye_x += EYE_DIAMETER + EYE_X_SEPARATION
draw_eye(canvas, eye_x, eye_y, "green")

def draw_eye(canvas, x, y, color):
"""
Draws an eye (a circle) with top-left corner at the specified location, and with the
specified fill color.  The eye is EYE_DIAMETER big.
"""
eye = canvas.create_oval(x, y, x + EYE_DIAMETER, y + EYE_DIAMETER)
canvas.set_fill_color(eye, color)

def draw_label(canvas):
"""
Draws a "Robot Face" text label on the screen centered horizontally, in large font.
"""
label = canvas.create_text(canvas.get_canvas_width() / 2, LABEL_Y, "Robot Face")
canvas.set_font(label, "Times New Roman", 44)

if __name__ == "__main__":
main()