To finish off the superturtle app, we are going to add the following to our program:
Move the printing of the menu options to the helper function, but run it in main.py
Add at least 3 new methods to the SuperTurtle class (whatever you want, but they should be obviously different than the things we wrote together.
Building an App
Let's get a little crazy here and build a pretty sophisticated app. We're building a SuperTurtle class with lots of methods. We've built some helper functions to provide random colors or print welcome messages. And we're building an interactive menu structure to run the whole app. But if we put all of this stuff in one file it gets to be a real mess. So let's split everything up like professional software developers.
SuperTurtle file
Let's make a new Python Trinket. Call it Final Turtle and save it. Then create a new file called superturtle.py. Notice that we don't include capitals or spaces in the names of our module file.
Now let's add our SuperTurtle class to this file. You can start with my copy below and then add in additional methods you may have built in our previous Trinkets.
from turtle import Turtlefrom random import randintclassSuperTurtle(Turtle):""" Our wrapper class of the turtle.Turtle object """def__init__(self,shape='turtle'):""" This is the turtle's constructor with a default shape of "turtle" """ Turtle.__init__(self) self.color(rancolor()) self.shape(shape) self.penup() self.speed(9999) self.goto_random()defgoto_random(self):""" Simple function that sends a turtle to a random location on a 400x400 canvas """ self.goto(randint(-200,200), randint(-200,200))deftriangle(self,length=50):""" Draws an equilateral triangle with a default length of 50 """ self.pendown() self.forward(length) self.left(120) self.forward(length) self.left(120) self.forward(length)defsquare(self,length=120):""" Draws a square with a default length of 120 """ self.pendown()for x inrange(4): self.forward(length) self.left(90)defhome(self):""" Returns to center position """ self.goto(0,0)defstar(self):""" Draws a 5-point star with a fixed length of 140 """ self.pendown()for x inrange(5): self.forward(140) self.left(145)
helper file
We're going to make a file with a bunch of helpful functions. Let's call it helper.py
And let's add this code:
from random import choicedefwelcome():for x inrange(3):print("**************")if x ==0:print("** WELCOME ***")defprint_options():print("--- MENU ---")print("1: Add turtle to gang")print("2: Draw a picture")print("Any other key will quit")defrancolor():""" This method returns a string from a list of colors available to Turtle's .color() method """ colors = ["brown", "darkorange", "maroon", "crimson", "navy", "salmon", "tomato", "khaki", "gold", "hotpink", "springgreen", "blue", "cyan", "purple", "green", "red", "pink", "yellow", "teal"]
returnchoice(colors)
Wiring them together
In order to access the rancolor() function from helper.py, we could import that specific function with from helper import rancolor
But what'd I'd rather do, is just import helper at the top and then change the rancolor line to helper.rancolor()
Main file
Let's add a basic menu to our app:
from superturtle import SuperTurtleimport helper# our collection of turtlesgang = []# welcome messagehelper.welcome()# menu loopwhileTrue: helper.print_options() selection =input("You selection: ")# analyize the selectionif"one"in selection or"1"in selection: gang.append(SuperTurtle())elif"two"in selection or"2"in selection:# loop through all our turtlesfor t in gang: t.star()# quit if no option is recognized else:break
Now go play!
Try changing this project. Add options and features. I'm here to help, too.
What if I want the help file to command my turtles?
The gang of turtles is in the main file. If we want to use it in the helper.py file, we need to pass it as a parameter. For example, I could add this method to my helper file that will make each turtle draw 100 stars:
defsuper_star(gang):for x inrange(100):for t in gang: t.star()
And perhaps I want to add this super_star option to my menu. So I'll add it to my print_options and to my main.py's if statements:
elif"three"in selection or"3"in selection: helper.super_star(gang)# pass the gang over to helper