隐藏乌龟窗口?

4 投票
3 回答
5500 浏览
提问于 2025-04-17 00:35

我正在用Turtle生成图形,在我的程序中,我需要从这些图形中找出一些特定的坐标。我想知道能不能把整个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运行得太慢了!有没有什么包和Turtle类似,但能更快执行命令的?

3 个回答

0

问题是,Turtle(海龟绘图)太慢了!有没有什么和Turtle一样的包,但能更快地执行命令呢?

其实,Turtle是可以加速的。如果我们在tkinter的实现中添加一个TurtleScreen,并使用它的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级的Hilbert曲线的所有点。而你发的代码输出一个4级的曲线却花了将近9秒。

1

是的,这是可以做到的。最简单的方法是创建一个根Tkinter窗口,然后把它隐藏起来,再用它作为RawTurtle的画布实例的主窗口。

举个例子:

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

不过,这样做还是会启动图形系统,只是不会显示窗口。

4

我按照thirtyseven的建议重新实现了海龟类。这个实现和原来的接口是一致的。也就是说,在这个类里向右转和在turtle里向右转是一样的。

不过,这个实现并没有包含接口中的所有方法,只包含了一些常用的方法。(还有你用到的那些方法)。

这个实现比较简短,也很容易扩展。而且,它会记录下它走过的所有点。每当你调用向前、向后或设置位置(或者这些函数的别名)时,它就会在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()

撰写回答