Re: clicking on turtle

Discussion in 'Python' started by Peter Otten, Nov 7, 2012.

  1. Peter Otten

    Peter Otten Guest

    Nicolas Graner wrote:

    > I have a problem with the standard "turtle" module. When a turtle has
    > a custom shape of type "compound", it doesn't seem to respond to click
    > events. No problem with polygon shapes.
    >
    > Running python 3.2.3, turtle version 1.1b on Windows XP.
    >
    > Here is my test file:
    >
    > ##################################################
    > import turtle
    > square = ((0,0),(0,20),(20,20),(20,0))
    > turtle.addshape("sq1", square) # sq1 = polygon shape
    > s = turtle.Shape("compound")
    > s.addcomponent(square, "red")
    > turtle.addshape("sq2", s) # sq2 = compound shape
    > t1 = turtle.Turtle(shape="sq1")
    > t2 = turtle.Turtle(shape="sq2")
    > t2.fd(20) # set the turtles side by side
    > def click(x,y): print("click at",x,y)
    > t1.onclick(click)
    > t2.onclick(click)
    > turtle.mainloop()
    > ##################################################
    >
    > When I run this and click on the black square (i.e. t1), the message
    > "click at..." gets printed on the console. When I click on the red
    > square (i.e. t2), nothing happens.
    >
    > Bug or feature?


    I believe it's a bug. Please report it on http://bugs.python.org
    As a quick-fix here's a monkey patch that seems to work:

    import turtle

    def _onclick(self, item, fun, num=1, add=None):
    if isinstance(item, list):
    for item in item:
    self._onclick(item, fun, num, add)
    return

    if fun is None:
    self.cv.tag_unbind(item, "<Button-%s>" % num)
    else:
    def eventfun(event):
    x, y = (self.cv.canvasx(event.x)/self.xscale,
    -self.cv.canvasy(event.y)/self.yscale)
    fun(x, y)

    self.cv.tag_bind(item, "<Button-%s>" % num, eventfun, add)

    turtle.TurtleScreenBase._onclick = _onclick

    square = ((0,0),(0,20),(20,20),(20,0))
    turtle.addshape("sq1", square) # sq1 = polygon shape
    s = turtle.Shape("compound")
    s.addcomponent(square, "red")
    turtle.addshape("sq2", s) # sq2 = compound shape
    t1 = turtle.Turtle(shape="sq1")
    t2 = turtle.Turtle(shape="sq2")
    t2.fd(20) # set the turtles side by side
    def click(x,y): print("click at",x,y)
    t1.onclick(click)
    t2.onclick(click)
    turtle.mainloop()
    Peter Otten, Nov 7, 2012
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Adrian M. Hanslik

    Zooming/streching turtle

    Adrian M. Hanslik, Nov 28, 2004, in forum: Java
    Replies:
    2
    Views:
    357
    Paul van Rossem
    Nov 28, 2004
  2. jevitop
    Replies:
    2
    Views:
    5,943
    Stewart Gordon
    Sep 17, 2003
  3. clicking on turtle

    , Nov 6, 2012, in forum: Python
    Replies:
    1
    Views:
    150
    Steven D'Aprano
    Nov 6, 2012
  4. Nicolas Graner

    clicking on turtle

    Nicolas Graner, Nov 6, 2012, in forum: Python
    Replies:
    0
    Views:
    137
    Nicolas Graner
    Nov 6, 2012
  5. Adam Funk
    Replies:
    7
    Views:
    215
    Adam Funk
    Feb 6, 2013
Loading...

Share This Page