Python中的海龟 - 尝试让海龟移动到鼠标点击的位置并打印其坐标

5
我正在尝试通过Python turtle获得鼠标位置。一切正常,除了我无法让海龟跳到鼠标单击的位置。
import turtle

def startmap(): #the next methods pertain to drawing the map
   screen.bgcolor("#101010")
   screen.title("Welcome, Commadore.")
   screen.setup(1000,600,1,-1)
   screen.setworldcoordinates(0,600,1000,0)
   drawcontinents()    #draws a bunch of stuff, works as it should but not really important to the question
   turtle.pu()
   turtle.onclick(turtle.goto)
   print(turtle.xcor(),turtle.ycor())
   screen.listen()

据我所知,代码行“turtle.onclick(turtle.goto)”应该将海龟发送到我单击鼠标的位置,但实际上并没有这样。打印行是一个测试,但它只返回我最后发送海龟的位置,即(0,650),虽然这并没有太大的意义。
我尝试查找教程和pydoc,但迄今为止我还没有成功写出来。
非常感谢您的帮助。谢谢。
编辑:我需要海龟前往单击位置(完成),但我也需要它打印坐标。
1个回答

9
你正在寻找onscreenclick()。它是TurtleScreen的一个方法。而Turtleonclick()方法则指的是在海龟本身上单击鼠标。令人困惑的是,TurtleScreenonclick()方法与其onscreenclick()方法是相同的。

24.5.4.3. 使用屏幕事件

turtle.onclick(fun, btn=1, add=None)
turtle.onscreenclick(fun, btn=1, add=None)

参数:

  • fun - 一个带有两个参数的函数,将使用画布上点击点的坐标调用该函数
  • num - 鼠标按钮的编号,默认为1(左键)
  • add - TrueFalse - 如果为 True,则将添加新的绑定,否则它将替换以前的绑定

fun 绑定到此屏幕上的鼠标单击事件。如果 funNone,则删除现有绑定。

示例:对于名为 screen 的 TurtleScreen 实例和名为 turtle 的 Turtle 实例:

>>> screen.onclick(turtle.goto) # Subsequently clicking into the TurtleScreen will
>>>                             # make the turtle move to the clicked point.
>>> screen.onclick(None)        # remove event binding again

注意: 这个TurtleScreen方法只能作为全局函数使用,名称为onscreenclick。全局函数onclick是从Turtle方法onclick派生出来的另一个函数。

言归正传...

所以,只需调用screen方法而不是turtle方法。只需要将其更改为:

screen.onscreenclick(turtle.goto)

如果你输入了turtle.onclick(lambda x, y: fd(100))(或类似的内容),当你点击时,你可能会看到海龟向前移动。使用goto作为fun参数,你将看到海龟去...它自己的位置。

每次移动都打印

如果你想在每次移动时打印,你应该定义自己的函数,它将告诉海龟去某个地方并打印信息。我认为这会起作用,因为turtle是一个单例。
def gotoandprint(x, y):
    gotoresult = turtle.goto(x, y)
    print(turtle.xcor(), turtle.ycor())
    return gotoresult

screen.onscreenclick(gotoandprint)

如果turtle.goto()返回None(我不知道),那么您实际上可以这样做:
screen.onscreenclick(lambda x, y: turtle.goto(x, y) or print(turtle.xcor(), turtle.ycor())

如果这个可以运行,请让我知道。我的电脑上没有tk,所以我无法测试它。


好的,谢谢你为我澄清这个问题。我很困惑为什么打印语句仍然没有给我海龟的位置。我尝试将其放在几个地方。如何获取刚移动到的海龟的位置? - Jacqlyn
1
@Jack 你需要在每次移动时打印输出。 - 2rs2ts
啊,谢谢你,我无法让一个单独的函数工作。这确实完成了我程序所需的功能。 - Jacqlyn
1
@Jack 我不知道你的意思。onscreenclick()中的fun必须是一个带有两个参数的函数。gotoandprint()和那个lambda都带有两个参数。你是指gotoandprint后面没有括号吗?那是因为它引用了函数对象。括号是调用对象的__call__方法的语法。在交互式shell中编写一个函数,然后只输入函数名,不加括号,你就会明白我的意思。 - 2rs2ts
好的,我后来了解到我所询问的是回调函数。我想我需要多学一些关于面向对象编程的知识。 - Jacqlyn
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接