|  | #!/usr/bin/env python | 
|  | """      turtle-example-suite: | 
|  |  | 
|  | tdemo_tree.py | 
|  |  | 
|  | Displays a 'breadth-first-tree' - in contrast | 
|  | to the classical Logo tree drawing programs, | 
|  | which use a depth-first-algorithm. | 
|  |  | 
|  | Uses: | 
|  | (1) a tree-generator, where the drawing is | 
|  | quasi the side-effect, whereas the generator | 
|  | always yields None. | 
|  | (2) Turtle-cloning: At each branching point the | 
|  | current pen is cloned. So in the end there | 
|  | are 1024 turtles. | 
|  | """ | 
|  | from turtle import Turtle, mainloop | 
|  | from time import clock | 
|  |  | 
|  | def tree(plist, l, a, f): | 
|  | """ plist is list of pens | 
|  | l is length of branch | 
|  | a is half of the angle between 2 branches | 
|  | f is factor by which branch is shortened | 
|  | from level to level.""" | 
|  | if l > 3: | 
|  | lst = [] | 
|  | for p in plist: | 
|  | p.forward(l) | 
|  | q = p.clone() | 
|  | p.left(a) | 
|  | q.right(a) | 
|  | lst.append(p) | 
|  | lst.append(q) | 
|  | for x in tree(lst, l*f, a, f): | 
|  | yield None | 
|  |  | 
|  | def maketree(): | 
|  | p = Turtle() | 
|  | p.setundobuffer(None) | 
|  | p.hideturtle() | 
|  | p.speed(0) | 
|  | p.tracer(30,0) | 
|  | p.left(90) | 
|  | p.penup() | 
|  | p.forward(-210) | 
|  | p.pendown() | 
|  | t = tree([p], 200, 65, 0.6375) | 
|  | for x in t: | 
|  | pass | 
|  | print len(p.getscreen().turtles()) | 
|  |  | 
|  | def main(): | 
|  | a=clock() | 
|  | maketree() | 
|  | b=clock() | 
|  | return "done: %.2f sec." % (b-a) | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | msg = main() | 
|  | print msg | 
|  | mainloop() |