隐藏乌龟窗口?
我正在用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 个回答
问题是,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秒。
是的,这是可以做到的。最简单的方法是创建一个根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
不过,这样做还是会启动图形系统,只是不会显示窗口。
我按照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()