Newbie Q about Turtle Gfx

Mensanator mensanator at aol.com
Wed Feb 18 18:43:29 EST 2009


On Feb 18, 4:16 pm, "Neil" <rubik_wiz... at NO.SPAMhotmail.com> wrote:
> Hello
>
> Sorry if this is not an appropriate newsgroup for this problem. I am very
> new to Python but not new to programming.
>
> I am hoping to use Python to teach a class and have been looking at the
> online book 'Snake Wrangling for Kids'.
>
> I have followed the example
>
> >>>import turtle
> >>>t=turtle.pen()

You defined "t" to be a pen object, not a turtle object.

>
> which works fine and displays a turtle in a window.
>
> However whenever I try to use something like
>
> >>>t.forward(50)   (taken from the book)

Pens don't move, turtles move (and the pen the turtle is
carrying draws a line, if down).

>
> i get the error...
>
> Traceback (most recent call last):
>   File "<pyshell#3>", line 1, in <module>
>     t.forward(50)
> AttributeError: 'dict' object has no attribute 'forward'
>
> I get the same error with t.left(10) etc. etc.

Pens can't turn left, turtles turn left.

>
> I have tried this with V2.6 and V3
>
> Any ideas would be much appreciated.
>
> Thanks
> Neil

Here's an example. It draws a Minimal Spanning Tree.

If you don't need an MST, take note of how I use the turtle.

import turtle
import random
import copy

def build_sv(start,stop,limit,C):
  """Sequence Vector Generator

  build_sv(start,stop,limit,C)
  start: start of Collatz sequence (must be odd)
  stop:  sequence termination
  limit: max length of [sv] if stop not found
       limit is sum(sv), not len(sv)
  C:     C of 3n+C
  returns [] if invalid
  returns SequenceVector [sv]
  """
  ONE = 1
  TWO = 2
  TWE = 3

  sv = []
  if (start % 2)==0: return sv
  done = 0
  count = 0
  while done==0:
    #
    # oops, power division may skip past stopping point
    # without seeing it
    #
    start = TWE*start + C
    f = 0
    t = start
    while t%2==0:
      f += 1
      t /= 2
    g = 0                      # stopping point may occur before f is
reached
    while (not done) and g<f:
      start = start >> 1
      if start==stop: done = 1
      count += 1
      g += 1
      if count==limit: done = 1
    sv.append(g)
  return sv

def Type12MH(k,i):
  """Find ith, kth Generation Type [1,2] Mersenne Hailstone using the
closed form equation

  Type12MH(k,i)
  k: generation
  i: member of generation
  returns Hailstone (a)
  """
  ONE = 1
  TWO = 2
  SIX = 6
  NIN = 9

  if (k<1) or (i<1): return 0

  a = (i-ONE)*NIN**(k-ONE) + (NIN**(k-ONE) - ONE)/TWO + ONE
  return TWO**(SIX*a - ONE) - ONE



turtle.clear()
turtle.up()

the_window = (turtle.window_width(),turtle.window_height())
print the_window,
turtle.goto(0,0)
tooter = turtle.position()
buffer_L = -((the_window[0]-200)/2)
buffer_R = (the_window[0]-200)/2
buffer_T = (the_window[1]-200)/2
buffer_B = -((the_window[1]-200)/2)
print buffer_L,buffer_R,buffer_T,buffer_B

turtle.tracer(False)
turtle.down()
turtle.speed('fastest')
t = 0
turtle.setheading(t)

for j in range(1):
  p = Type12MH(4,2)  # Type12 Mersenne Hailstone (very big)
  sv = build_sv(p,1,10000000,1) # limit to 10 million numbers in
vector


# Minimal Spanning Tree
  stars = []
  turtle.up()
  for d in sv:                         # random turtle crawl based on
sv
    if d>1:                          # skip small sv values for
movement
      for r in xrange(1):
        turtle.setheading(t+r*90)
        turtle.forward(d*4)      # scale of grid
      tooter = turtle.position()
      if d>8:                      # create a star at really large sv
values
        turtle.down()
        turtle.width(3)
        turtle.color('black')
        turtle.forward(1)        # draw a blob
        turtle.backward(1)
        stars.append((int(tooter[0]),int(tooter[1])))
        turtle.up()
        turtle.width(1)
        turtle.color('red')      # color of MST spans
      whither_tooter = []          # build list of legal next turns
      if tooter[0]>buffer_L:       # test for being too close to
screen edge
        whither_tooter.append(180)
      if tooter[0]<buffer_R:
        whither_tooter.append(0)
      if tooter[1]<buffer_T:
        whither_tooter.append(90)
      if tooter[1]>buffer_B:
        whither_tooter.append(270)
      t = random.choice(whither_tooter) # choose random direction from
list of legal moves
  print 'stars:',len(stars)

  star_dist = []                      # create list of spans between
stars
  for i,src in enumerate(stars):
    for j,dst in enumerate(stars):
      dist = turtle.sqrt((src[0]-dst[0])**2 + (src[1]-dst[1])**2)
      if dist == 0:
        star_dist.append([9999,i,j])
      else:
        star_dist.append([dist,i,j])

  star_dist.sort()

  MST = []                            # spans of MST
  MST2 = []                           # only those spans that can
connect to existing MST
  points_used = {}                    # list of stars that are
currently on MST

  s = copy.deepcopy(star_dist[0])     # going to modify list element,
so deep copy needed
  MST.append(s)                       # fist span always smallest
absolute distance
  points_used[s[1]] = 1
  points_used[s[2]] = 1
  star_dist[0][0] = 9999              # overwrite distance so this
span can't be used again
  found = False                       # also, overwrite complement
span
  si = 0
  while not found:
    ss = star_dist[si]
    if s[1]==ss[2] and s[2]==ss[1]: # the complement
      star_dist[si][0] = 9999
      found = True
    else:
      si += 1
  while len(MST)<(len(stars)-1):        # an MST of n points always
has n-1 spans
    for i,sd in enumerate(star_dist): # copy points matching s to MST2
      # only spans that could connect to existing
      # tree points can be added at this stage
      # (only have to check for last added to MST)
      if (sd[0]!=9999) and  \
         ((sd[1]==s[1]) or  \
        (sd[1]==s[2]) or  \
        (sd[2]==s[1]) or  \
        (sd[2]==s[2])):
        MST2.append(copy.deepcopy(sd))
        star_dist[i][0] = 9999    # once copied to MST2, overwrite
original distance
    MST2.sort()
    close = 0
    #
    # can't use a span if BOTH points already on MST, otherwise we get
loops
    # and some stars remain disjoint
    #
    while ((MST2[close][1] in points_used) and (MST2[close][2] in
points_used)):
      close += 1
    s = copy.deepcopy(MST2[close])
    MST.append(s)
    if s[1] in points_used:           # only keys used to create tree,
values
      points_used[s[1]] += 1        # will eventully be number of
points
    else:                             # connected to this point
      points_used[s[1]] = 1
    if s[2] in points_used:
      points_used[s[2]] += 1
    else:
      points_used[s[2]] = 1
    MST2[close][0] = 9999             # overwrite this point and its
complement
    found = False
    si = 0
    while not found:
      ss = MST2[si]
      if s[1]==ss[2] and s[2]==ss[1]: # the duplicate
        MST2[si][0] = 9999
        found = True
      else:
        si += 1
        if si == len(MST2): found = True

  for span in MST:               # from an MST span
    srcx = stars[span[1]][0]   # get coords of two endpoints
    srcy = stars[span[1]][1]
    dstx = stars[span[2]][0]
    dsty = stars[span[2]][1]
    turtle.up()                # and draw a line between them
    turtle.goto(srcx,srcy)
    turtle.down()
    turtle.goto(dstx,dsty)






More information about the Python-list mailing list