【问题标题】:Hide Turtle Window?隐藏龟窗?
【发布时间】:2011-11-06 09:41:31
【问题描述】:

我在 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 一样但可以更快地执行命令的包?

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    我按照三十七的建议重新实现了海龟类。与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()
    

    【讨论】:

      【解决方案2】:

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

      很遗憾,这仍然会启动图形系统,但不会出现任何窗口。

      【讨论】:

      • 不可能隐藏所有东西,即使是画布?我希望没有任何窗口可以全部显示出来。
      • 这是一种可能,我很感激。
      • 一个更完整的解决方案将涉及从 python 源中分叉 turtle.py,并重新实现 TurtleScreenBase 以便不调用 Tk。
      • 说实话,我是 Python 新手,你会怎么做?
      【解决方案3】:

      问题是 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 级希尔伯特曲线中的所有点。您发布的代码需要将近 9 秒才能输出 4 级。

      【讨论】:

        猜你喜欢
        • 2015-04-15
        • 1970-01-01
        • 2023-03-28
        • 2010-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多