藏乌龟窗?

2024-10-01 13:25:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

编辑:

问题2:

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

我的程序在某种程度上起作用了,如果你在空闲状态下运行并输入“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)

问题是乌龟太慢了!有没有一个程序包像海龟一样,但可以更快地执行命令?在


Tags: importlt程序sizetkinter图表rootlevel
3条回答

我按照37岁的建议重新实施了海龟课程。与api一致。(也就是说,在这个类中右转时,与在turtle中右转相同。在

这并不是实现api中的所有方法,只实现了常见的方法。(以及你用过的那些)。

然而,它很短,而且很容易扩展。此外,它还可以记录所有到达的点。它通过在每次调用forward、backward或setpos(或这些函数的任何别名)时添加一个条目来实现这一点。在

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()

是的,这是可能的。最简单的方法是实例化一个根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

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

The problem is that Turtle is so SLOW! Is there any package that is just like Turtle but can do commands much faster?

是的,乌龟可以。如果我们在tkinter实现中添加一个TurtleScreen,并使用它的tracer()功能,那么我们可以比turtle的speed()方法更快。我们可以通过放弃定制来大大简化代码,只需使用turtle自己的begin_poly()end_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曲线中的所有点。您发布的代码需要将近9秒才能输出一个级别4。在

相关问题 更多 >