Fred Agbo
October 26, 2026
pglpgl.py also supports a mechanism to choose
files interactively, made available through the
filechooser.py library module.filechooser.py exports two functions:
choose_input_file for selecting a
filechoose_output_file for selecting a
folder and filename to save a file tofilename = choose_input_file()
with open(filename) as f:
# Code to read file
filechooser.py from
Canvas -> Modules -> Week 10 -> Additional
Resources# Ensure you import the methods from filechooser
from filechooser import choose_input_file, choose_output_file
filename= choose_output_file()
try:
with open(filename, "a") as fh:
fh.write("Here is a new text")
except IOError:
print("The file location is not correct")
Suppose you had the file contents to the left and wanted to turn it into the contents on the right. Which code snippet below would accomplish this?
food
fooddoof
with open(file) as fh:
data = fh.read()
with open(file, 'w') as fh:
fh.write(data[::-1])
with open(file) as fh:
data = fh.read()
with open(file, 'a') as fh:
fh.write(data[::-1])
with open(file, 'rw') as fh:
data = fh.read()
fh.write(data[::-1])
with open(file) as fh:
data = fh.read()
with open(file, 'a') as fh:
fh.write(data[-2::-1])
employee = ("Bob Cratchit", "clerk", 15)You can select or slice elements from a tuple just like you can with lists
If using tuples, you can make programs more readable by using a destructuring assignment, which breaks a tuple into named components:
name, title, salary = employeeWhile modern versions of Python have such thing as a named tuple, we will not look at them here.
One of the most simple examples of tuple usage would be storing location information in 2d space
By storing both \(x\) and \(y\) coordinates in a tuple, it makes that information easier to store and pass around your program
When you need to use the points, best to destructure:
x,y = ptreturn x, y is the same as
return (x,y)enumeratezipWe have multiple ways to iterate through a string or list:
By element:
for ch in string:
# body of loop using chBy index:
for i in range(len(string)):
# body of loop using iUsing enumerate lets us get both!
for i, ch in enumerate(string):
# body of loop using both ch and iSometimes you have multiple lists that you want to loop over in a “synced” fashion
The zip function iterates through
tuples of pairs of elements
For example
zip([1,2,3], ["one", "two", "three"])
would yield (1, "one"), then
(2, "two"), and then
(3, "three")
Can unpack or destructure as part of a
for loop:
for x,y in zip([1,2,3],[4,5,6]):
# body of loop using paired x and yDELTA ahead

from pgl import GWindow, GLine, GRect
PEG_SEP = 3
PEG_ACROSS = 300
PEG_DOWN = 150
DELTA = 332
GWIDTH = PEG_ACROSS * PEG_SEP
GHEIGHT = PEG_DOWN * PEG_SEP
def place_pegs():
""" Returns a list of points, where the points are tuples. """
list_pts = []
for i in range(PEG_ACROSS):
list_pts.append((i * PEG_SEP, 0))
for i in range(PEG_DOWN):
list_pts.append((GWIDTH, i * PEG_SEP))
for i in range(PEG_ACROSS):
list_pts.append((GWIDTH - i * PEG_SEP, GHEIGHT))
for i in range(PEG_DOWN):
list_pts.append((0, GHEIGHT - i * PEG_SEP))
return list_pts
def draw_pattern(list_pts, color='black'):
""" Creates a window and draws in the necessary yarn. """
gw = GWindow(GWIDTH, GHEIGHT)
current_i = 0
finished = False
while not finished:
next_i = (current_i + DELTA) % len(list_pts)
x1, y1 = list_pts[current_i]
x2, y2 = list_pts[next_i]
line = GLine(x1, y1, x2, y2)
line.set_line_width(2)
line.set_color(color)
gw.add(line)
current_i = next_i
if current_i == 0:
finished = True
if __name__ == '__main__':
pegs = place_pegs()
draw_pattern(pegs, 'green')
What would the code to the left print off?
246A = (1, 2, (3, 4))
B = A[1::2]
x, y, z = A
for i in range(x):
B += z
print(y * B[-2])
GImage type objectGrayscaleImage.py that you can import into
your main programGButtonGButton gets a label and a callback
function name that determines what function is called when that button
is clickedadd_button function which will take care of
adding a new button to the correct part of the screen.
GImage currently
displayed on the window in a variable called
gw.current_imagegw so that you will have access to it in any
callback function you writeset_image on the output of your manipulation
function, which will take care of updating the value of
gw.current_imageImageShop.py as needed.