Python 3.x 如何分别处理海龟的咔嗒声和海龟的咔嗒声?

Python 3.x 如何分别处理海龟的咔嗒声和海龟的咔嗒声?,python-3.x,onclick,turtle-graphics,Python 3.x,Onclick,Turtle Graphics,使用Python 3 turtle模块,我尝试分别处理两种不同的单击条件: 如果点击海龟,它应该调用一个函数。在下面的示例中,它应该从黑色切换到红色,反之亦然。 如果点击不在可见的海龟上,则应调用不同的函数在该点创建海龟。 现在,我可以使用两个不同的鼠标按钮来实现这一点,如下所示: #!/usr/local/bin/python3 import turtle sc = turtle.Screen() def new_turtle(x, y): t = turtle.RawTurtle(

使用Python 3 turtle模块,我尝试分别处理两种不同的单击条件:

如果点击海龟,它应该调用一个函数。在下面的示例中,它应该从黑色切换到红色,反之亦然。 如果点击不在可见的海龟上,则应调用不同的函数在该点创建海龟。 现在,我可以使用两个不同的鼠标按钮来实现这一点,如下所示:

#!/usr/local/bin/python3

import turtle

sc = turtle.Screen()

def new_turtle(x, y):
  t = turtle.RawTurtle(sc, shape='circle', visible=False)
  t.penup()
  t.speed(0)
  t.goto(x, y)
  t.color('black')
  t.showturtle()
  t.onclick(selector(t), 2)

def deselector(t):
  def deselect(x, y):
    t.color('black')
    t.onclick(selector(t), 2)
  return deselect

def selector(t):
  def select(x, y):
    t.color('red')
    t.onclick(deselector(t), 2)
  return select

sc.onscreenclick(new_turtle, 1)

turtle.mainloop()
但是,我想用第二个鼠标按钮做其他事情

如果上面的代码被更改为使用鼠标按钮1进行所有操作,则海龟在单击时确实会像预期的那样改变颜色,但onscreenclick处理程序也会被调用,以便在更改颜色的海龟的正上方创建一个新海龟


如果点击不是在海龟身上,有没有办法只调用onscreenclick处理程序?

我相信下面的内容可以满足您的描述。正如您所注意到的,如果在同一个按钮上同时有一个screen button事件处理程序和一个turtle button事件处理程序处于活动状态,那么这两个事件都会被触发!对于坐在tkinter上的初学者友好编程环境来说,这似乎是错误的。但你有它

我下面的解决方案是让screen button事件处理程序测试点击是否可能发生在海龟身上,如果是,则忽略它。这只允许turtle按钮事件处理程序处理单击:

from turtle import Screen, Turtle
from functools import partial

CURSOR_SIZE = 20

def new_turtle(x, y):
    screen.onscreenclick(None)  # disable event handler inside handler

    # don't respond if the click was on a turtle
    if not any(t.distance(x, y) <= CURSOR_SIZE/2 for t in screen.turtles()):
        t = Turtle(shape='circle', visible=False)
        t.color('black')
        t.penup()
        t.goto(x, y)
        t.showturtle()
        t.onclick(partial(select, t))

    screen.onscreenclick(new_turtle)  # reenable event handler

def select(t, x, y):
    t.color('black' if t.pencolor() == 'red' else 'red')

screen = Screen()

screen.onscreenclick(new_turtle)

screen.mainloop()
这不需要检查海龟,因此不会减慢速度。也不要像你在离海龟很近的地方点击一样挑剔。但是,如果计时不匹配,则可能必须使用其他版本

from turtle import Screen, Turtle
from functools import partial, update_wrapper

def new_turtle(x, y):
    screen.onscreenclick(None)  # disable this event handler inside handler

    t = Turtle(shape='circle', visible=False)
    t.color('black')
    t.penup()
    t.goto(x, y)
    t.showturtle()
    t.onclick(partial(select, t))

    screen.onscreenclick(new_turtle)  # reenable event handler

def select(t, x, y):
    screen.onscreenclick(None)  # disable screen event handler inside handler
    t.onclick(None)  # disable this event handler inside handler

    t.color('black' if t.pencolor() == 'red' else 'red')

    t.onclick(partial(select, t))  # reenable this event handler
    screen.ontimer(wrapper)  # reenable screen event handler, eventually

screen = Screen()

wrapper = partial(screen.onscreenclick, new_turtle)  # prep wrapper for later use
update_wrapper(wrapper, screen.onscreenclick)

screen.onscreenclick(new_turtle)

screen.mainloop()