如何使用龟图模块同步动画?

时间:2017-08-30 16:40:11

标签: python python-3.x turtle-graphics

我编写了以下python代码,使用python turtle创建旋转图形的动画。我面临的问题是,动画没有正确同步。我不想向人们展示事物是如何旋转的。所以,我必须在turtle.tracer命令中仔细选择帧速率。好吧,如果你仔细观察,r的每个值都会创建一个旋转,所以我必须在每个r的末尾更新屏幕。并且对于r的每个值,在r的循环内有1202次迭代。但这并没有产生预期的效果。

我该怎么做才能纠正这个问题?

import turtle
import math

am = turtle
am.ht()
am.tracer(1202,0)

for r in range(0,600):
    #axes
    am.pu()
    am.setpos(0,500)
    am.pd()
    am.setpos(0,-500)
    am.pu()
    am.setpos(-650,0)
    am.pd()
    am.setpos(0,0)
    am.write("0",align="right",font=("Times New Roman",14,"normal"))
    am.setpos(650,0)
    am.pu()
    am.setpos(-300*math.cos(r*math.pi/100),300*math.sin(r*math.pi/100))
    am.pd()
    #axes
    am.pencolor("red")
    for x in range(-300,301):
        g=math.sin(x)
        t=math.cos(x)
        y =100*g*t*math.sin(2*(x**2)*math.pi/100)
        am.setpos(x*math.cos(r*math.pi/100)+y*math.sin(r*math.pi/100),-x*math.sin(r*math.pi/100)+y*math.cos(r*math.pi/100))
    #if(x%4==0):
       #am.write(x)
    am.pu()
    am.setpos(-300*math.sin(r*math.pi/100),-300*math.cos(r*math.pi/100))
    am.pd()
    am.pencolor("blue")
    for y in range(-300,301):
        c=math.sin(y)
        d=math.cos(y)
        x =100*c*d*math.cos(2*(y**2)*math.pi/100)
        am.setpos(x*math.cos(r*math.pi/100)+y*math.sin(r*math.pi/100),-x*math.sin(r*math.pi/100)+y*math.cos(r*math.pi/100))
    am.reset()

am.exitonclick()

1 个答案:

答案 0 :(得分:2)

我相信以下会做你想做的事。当您准备好向用户显示某些内容时,我已将更改后的跟踪器逻辑更改为手动显式.update()。我还将轴绘图与主循环分开,因为我们每次都不需要清除和重绘它:

import math
from turtle import Turtle, Screen

screen = Screen()
screen.tracer(0)

# axes
axes = Turtle(visible=False)
axes.pu()
axes.setpos(0, 500)
axes.pd()
axes.setpos(0, -500)
axes.pu()
axes.setpos(-650, 0)
axes.pd()
axes.setpos(0, 0)
axes.write("0", align="right", font=("Times New Roman", 14, "normal"))
axes.setpos(650, 0)

am = Turtle(visible=False)

for r in range(0, 600):

    am.pu()
    am.setpos(-300 * math.cos(r * math.pi / 100), 300 * math.sin(r * math.pi / 100))
    am.pd()
    am.pencolor("red")

    for x in range(-300, 301):
        g = math.sin(x)
        t = math.cos(x)
        y = 100 * g * t * math.sin(2 * x**2 * math.pi / 100)
        am.setpos(x * math.cos(r * math.pi / 100) + y * math.sin(r * math.pi / 100), -x * math.sin(r * math.pi / 100) + y * math.cos(r * math.pi / 100))

    am.pu()
    am.setpos(-300 * math.sin(r * math.pi / 100), -300 * math.cos(r * math.pi / 100))
    am.pd()
    am.pencolor("blue")

    for y in range(-300, 301):
        c = math.sin(y)
        d = math.cos(y)
        x = 100 * c * d * math.cos(2 * y**2 * math.pi / 100)
        am.setpos(x * math.cos(r * math.pi / 100) + y * math.sin(r * math.pi / 100), -x * math.sin(r * math.pi / 100) + y * math.cos(r * math.pi / 100))

    screen.update()
    am.reset()
    am.hideturtle()  # made visible by reset()

screen.exitonclick()

最后,这可能是一个错误:

am = turtle

并没有按照你的想法行事(模块名称别名而不是实际的乌龟。)