如何使雪花旋转更平稳?

时间:2020-09-26 14:40:01

标签: python python-turtle

我是python动画的新手,尽管设法使用动画使雪花旋转,但雪花旋转得并不那么顺畅... 我已附上以下代码,有人可以建议我如何使它旋转更平稳吗?

import turtle
import time
bob = turtle.Turtle()
bob.ht()
screen = turtle.Screen()
bob.speed(100)
screen.tracer(0, 0)
n = 0
bob.pencolor("blue")
bob.pensize(5)

def vshape():
  bob.rt(25)
  bob.fd(50)
  bob.backward(50)
  bob.lt(50)
  bob.fd(50)
  bob.backward(50)
  bob.rt(25)

def snowflakeArm():
  for x in range(4):
    bob.fd(30)
    vshape()
  bob.backward(120)
    
def snowflake(n, x, y):
  bob.seth(n)
  bob.pu()
  bob.setpos(x ,y)
  bob.pd()
  for x in range(6):
    snowflakeArm()
    bob.rt(60)

while True:
  time.sleep(0.02)
  bob.update()
  bob.clear()
  snowflake(n, 0, 0)
  snowflake(n, 350, 0)
  snowflake(n, -350, 0)
  snowflake(n, 0, 350)
  snowflake(n, 0, -350)
  n += 10

我试图减少睡眠时间并减少旋转量,但仍然没有结果...

1 个答案:

答案 0 :(得分:0)

令我担心的是,您能够成功调用bob.update(),因为在Python 3或Python 2发行的标准turtle.py中,update()不是Turtle的方法。您可能使用的是较旧的或非标准的turtle实施,因此可能需要调整以下某些内容。

让我们使用乌龟time.sleep()事件,而不是引入与乌龟自己的事件处理程序不同步的ontimer()

from turtle import Screen, Turtle

def vshape():
    turtle.right(25)
    turtle.forward(50)
    turtle.backward(50)
    turtle.left(50)
    turtle.forward(50)
    turtle.backward(50)
    turtle.right(25)

def snowflakeArm():
    for _ in range(4):
        turtle.forward(30)
        vshape()

    turtle.backward(120)

def snowflake(angle, position):
    turtle.setheading(angle)

    turtle.penup()
    turtle.setposition(position)
    turtle.pendown()

    for _ in range(360 // 60):
        snowflakeArm()
        turtle.right(60)

angle = 0

def snowflakes():
    global angle

    turtle.clear()

    snowflake(angle, (0, 0))
    snowflake(angle, (350, 0))
    snowflake(angle, (-350, 0))
    snowflake(angle, (0, 350))
    snowflake(angle, (0, -350))

    screen.update()

    angle = (angle + 10) % 360

    screen.ontimer(snowflakes, 25)  # repeat 25 milliseconds from now

screen = Screen()
screen.tracer(False)

turtle = Turtle()
turtle.hideturtle()
turtle.pencolor('blue')
turtle.pensize(5)

snowflakes()

screen.exitonclick()

这还应该允许我们通过单击窗口来干净地退出程序,而不会生成所有那些警告消息。