Python 3.x 如何分别处理海龟的咔嗒声和海龟的咔嗒声?
使用Python 3 turtle模块,我尝试分别处理两种不同的单击条件: 如果点击海龟,它应该调用一个函数。在下面的示例中,它应该从黑色切换到红色,反之亦然。 如果点击不在可见的海龟上,则应调用不同的函数在该点创建海龟。 现在,我可以使用两个不同的鼠标按钮来实现这一点,如下所示: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(
#!/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()