Today: Canvas drawing, running in PyCharm from command line
Expand the .zip to get a "draw1" folder with .py files in it. Run PyCharm. Use Open... menu to open the ***folder***
Then use the "Terminal" tab at lower left to run by command line as shown below
Command Line is the - "pro" way to control the compouter.
We'll use the CS106A "DrawCanvas" which supports these functions:
def draw_line(x1, y1, x2, y2): """ Draws a black line between points x1,y1 and x2,y2 Optional color='red' parameter can specify a color. """ def draw_rect(x, y, width, height): """ Draws a 1 pixel rectangle frame with its upper left at x,y and covering width, height pixels. Takes optional color='red' parameter. """ def fill_rect( x, y, width, height): """ Draws a solid black rectangle with its upper left at x,y and covering width, height pixels. Takes optional color='red' parameter. """ def draw_oval(x, y, width, height): """ Draws a 1 pixel oval frame with its upper left bounding rect at x,y and covering width, height pixels. Takes optional color='red' parameter. """ def fill_oval(x, y, width, height): """ Draws a solid black oval with its upper left bounding rect at x,y and covering width, height pixels. Takes optional color='red' parameter. """ def draw_string(x, y, text): """ Draws a black text string with its upper left at x,y Takes optional color='red' parameter. """
These are noun.verb functions on a Canvas like this:
canvas = DrawCanvas(500, 300) # create with width,height canvas.draw_line(0, 0, 100, 100, color='red') ...
def draw_oval(canvas, x, y, width, height): """ Given a canvas and x,y and width,height Draw the "oval" figure inside these bounds. (this code is complete) """ canvas.draw_rect(x, y, width, height) canvas.fill_oval(x, y, width, height, color='yellow') # upper-left to lower-right canvas.draw_line(x, y, x + width - 1, y + height - 1, color='red') # lower-left to upper-right canvas.draw_line(x, y + height - 1, x + width - 1, y, color='red')
The main() in this case calls draw_oval() twice, once upper left and once lower right. This tests that the x,y are handled correctly. Open the "terminal" at the lower left of PyCharm. The "$" below is the prompt, the rest you type (on Windows its "python" instead of "python3".)
$ python3 draw1.py -oval 500 200
In the terminal, hit the up arrow. Edit the old command and run it again easily. This is a very productive and fast way to run and vary your program.
for i in range(n): y_add = (i / (n - 1)) * (height - 1)
def draw_lines1(canvas, x, y, width, height, n): """ Draw the lines1 figure within x,y width,height """ canvas.draw_rect(x, y, width, height) # Figure y_add for each i in the loop for i in range(n): y_add = (i / (n - 1)) * (height - 1) # formula: 0..1 fraction * max canvas.draw_line(x, y, x + width - 1, y + y_add, color='red')
Run from command line
$ python3 draw1.py -lines1 300 200 12
Run from the command line:
$ python3 draw1.py -lines2 300 200 12
def draw_lines2(canvas, x, y, width, height, n): """ Draw the lines2 figure within x,y width,height The code for lines1 is already here """ canvas.draw_rect(x, y, width, height) for i in range(n): y_add = (i / (n - 1)) * (height - 1) # formula: 0..1 fraction * max canvas.draw_line(x, y, x + width - 1, y + y_add, color='red') # loop to draw green "lines2" lines for i in range(n): pass y_add = (i / (n - 1)) * (height - 1) x_add = (i / (n - 1)) * (width - 1) canvas.draw_line(x, y + y_add, x + x_add, y + height - 1, color='green')
>>> 500 / 11 45.45454545454545 # float division with fraction >>> 500 // 11 # int division - what we want here 45
Run from command line:
$ python3 draw1.py -grid1 600 400 12
Solution code
def draw_grid1(width, height, n): """ Creates a canvas. Draws a grid1 of n-by-n black rectangles (this code is complete) """ canvas = DrawCanvas(width, height, fast_draw=True) # Figure sizes for all sub rects sub_width = width // n sub_height = height // n # Loop over row/col for row in range(n): for col in range(n): # Figure upper left of this sub rect x = col * sub_width y = row * sub_height canvas.draw_rect(x, y, sub_width, sub_height)
Here is the draw_lines2() def first line:
def draw_lines2(canvas, x, y, width, height, n): """ Draw the lines2 figure within x,y width,height The code for lines1 is already here """
def draw_grid2(width, height, n): """ Creates a canvas. Add code to draw the lines2 figure in each grid sub rect. """ canvas = DrawCanvas(width, height, fast_draw=False) sub_width = width // n sub_height = height // n for row in range(n): for col in range(n): pass # Your code here - draw a lines2 figure in each grid rect x = col * sub_width y = row * sub_height # key line: call the function to draw the figure here draw_lines2(canvas, x, y, sub_width, sub_height, n)