3

我在 Turtle 中生成图表,作为程序的一部分,我从图表中识别出某些坐标。我希望能够隐藏完整的乌龟窗口,因为我只关心坐标,这可能吗?

编辑:

问题2:

这不是一个真正的答案,而是一些其他问题。

我的程序在某种程度上可以工作,如果你在 IDLE 中运行它并输入“l”,它会给你一个带有坐标的列表。

import Tkinter
import turtle

from turtle import rt, lt, fd   # Right, Left, Forward

size = 10

root = Tkinter.Tk()
root.withdraw()

c = Tkinter.Canvas(master = root)
t = turtle.RawTurtle(c)

t.speed("Fastest")

# List entire coordinates
l = []

def findAndStoreCoords():
    x = t.xcor()
    y = t.ycor()

    x = round(x, 0)     # Round x to the nearest integer
    y = round(y, 0)     # Round y to the nearest integer

    # Integrate coordinates into sub-list
    l.append([x, y])

def hilbert(level, angle):
    if level == 0:
        return

    t.rt(angle)
    hilbert(level - 1, -angle)
    t.fd(size)
    findAndStoreCoords()
    t.lt(angle)
    hilbert(level - 1, angle)
    t.fd(size)
    findAndStoreCoords()
    hilbert(level - 1, angle)
    t.lt(angle)
    t.fd(size)
    findAndStoreCoords()
    hilbert(level - 1, -angle)
    t.rt(angle)

问题是乌龟太慢了!是否有任何类似于 Turtle 但可以更快地执行命令的包?

4

3 回答 3

4

我按照三十七的建议重新实现了海龟类。与api一致。(即当你在这个班级右转时,它和右转是一样的turtle

这并没有实现api中的所有方法,只实现了常用的。(以及您使用的那些)。

但是,它的扩展很短且相当简单。此外,它会跟踪它去过的所有点。它通过在每次调用 forward、backward 或 setpos(或这些函数的任何别名)时向 pointsVisited 添加一个条目来实现这一点。

import math

class UndrawnTurtle():
    def __init__(self):
        self.x, self.y, self.angle = 0.0, 0.0, 0.0
        self.pointsVisited = []
        self._visit()

    def position(self):
        return self.x, self.y

    def xcor(self):
        return self.x

    def ycor(self):
        return self.y

    def forward(self, distance):
        angle_radians = math.radians(self.angle)

        self.x += math.cos(angle_radians) * distance
        self.y += math.sin(angle_radians) * distance

        self._visit()

    def backward(self, distance):
        self.forward(-distance)

    def right(self, angle):
        self.angle -= angle

    def left(self, angle):
        self.angle += angle

    def setpos(self, x, y = None):
        """Can be passed either a tuple or two numbers."""
        if y == None:
            self.x = x[0]
            self.y = y[1]
        else:
            self.x = x
            self.y = y
        self._visit()

    def _visit(self):
        """Add point to the list of points gone to by the turtle."""
        self.pointsVisited.append(self.position())

    # Now for some aliases. Everything that's implemented in this class
    # should be aliased the same way as the actual api.
    fd = forward
    bk = backward
    back = backward
    rt = right
    lt = left
    setposition = setpos
    goto = setpos
    pos = position

ut = UndrawnTurtle()
于 2011-08-31T04:58:17.183 回答
1

是的,这是可能的。最简单的方法是实例化一个根 Tkinter 窗口,将其撤回,然后将其用作 RawTurtle 的 Canvas 实例的主窗口。

例子:

import Tkinter
import turtle

root=Tkinter.Tk()
root.withdraw()
c=Tkinter.Canvas(master=root)
t=turtle.RawTurtle(c)
t.fd(5)
print t.xcor() # outputs 5.0

不幸的是,这仍然会启动图形系统,但不会出现任何窗口。

于 2011-08-29T23:24:13.270 回答
0

问题是乌龟太慢了!是否有任何类似于 Turtle 但可以更快地执行命令的包?

是的,乌龟可以。如果我们将 a 添加TurtleScreen到 tkinter 实现中,并使用它的tracer()功能,我们可以比turtle 的speed()方法加快速度。我们可以通过折腾自定义来大大简化代码,只需使用turtle自己的begin_poly(),end_poly()get_poly()方法:

from tkinter import Tk, Canvas
from turtle import TurtleScreen, RawTurtle

SIZE = 10

def hilbert(level, angle):
    if level == 0:
        return

    turtle.right(angle)
    hilbert(level - 1, -angle)
    turtle.forward(SIZE)
    turtle.left(angle)
    hilbert(level - 1, angle)
    turtle.forward(SIZE)
    hilbert(level - 1, angle)
    turtle.left(angle)
    turtle.forward(SIZE)
    hilbert(level - 1, -angle)
    turtle.right(angle)

root = Tk()
root.withdraw()

canvas = Canvas(master=root)
screen = TurtleScreen(canvas)
screen.tracer(False)  # turn off turtle animation

turtle = RawTurtle(screen)
turtle.begin_poly()  # start tracking movements

hilbert(5, 90)

turtle.end_poly()  # end tracking movements

print(turtle.get_poly())

这会在我的系统上以大约 1/3 秒的时间打印 5 级希尔伯特曲线中的所有点。您发布的代码需要将近 9 秒才能输出 4 级。

于 2020-01-05T03:00:13.240 回答