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 中查找,但到目前为止我还没有成功编写这个。

我感谢您的帮助。谢谢你。

编辑:我需要海龟去点击位置(完成),但我也需要它来打印坐标。

4

1 回答 1

9

您正在寻找onscreenclick(). 它是一种方法TurtleScreen。a的onclick()方法是Turtle指鼠标点击海龟本身。令人困惑的是,方法和它的onclick()方法TurtleScreen是一回事onscreenclick()

24.5.4.3。使用屏幕事件

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

参数:

  • fun – 带有两个参数的函数,将使用画布上单击点的坐标调用
  • num – 鼠标按钮的编号,默认为 1(鼠标左键)
  • addTrueor False– if True,将添加新的绑定,否则将替换以前的绑定

将乐趣绑定到此屏幕上的鼠标单击事件。如果fun is None,则移除现有绑定。

一个名为 TurtleScreen 的实例screen和一个名为 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

快速切割...

所以,只需调用screenand not的方法turtle。就像将其更改为一样简单:

screen.onscreenclick(turtle.goto)

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

每次移动时打印

如果您想在每次移动时打印,您应该定义自己的函数来执行此操作并告诉海龟去某个地方。我认为这会起作用,因为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,所以无法测试。

于 2013-07-25T17:06:25.367 回答