如何通过移动第二根指针线(分钟)来绘制时钟动画

时间:2019-03-16 05:18:31

标签: python animation clock turtle-graphics

最近,我在python上弄清楚了如何制作一条直线。

我现在想做的是知道如何用移动的第二手(分钟)和没有时针的时钟动画。

我当前的动线动画阶段: Current state

我要实现的目标:

End result

由于它们是屏幕截图,因此不会显示移动

我的代码

import turtle
import time
turtle.hideturtle()

def draw_line(x,y,heading,length,color):
    turtle.up()
    turtle.goto(x,y)
    turtle.down()
    turtle.setheading(heading)
    turtle.color(color)
    turtle.fd(length)

turtle.tracer(0,0)
for heading in range(0,-360*100,-6):
    turtle.clear()
    draw_line(0,0,heading,200,'blue')
    turtle.update()
    time.sleep(1)

如果有人提供了如何设置时钟,这也会有所帮助

1 个答案:

答案 0 :(得分:0)

不清楚您要问的是什么,但我假设这是两件事:首先,如何添加另一条移动线;第二,如何设置这些线的角度以匹配实际(本地)时间。我对下面的代码进行了重新处理以完成这两项工作,并且花费了一个小时的时间,而且成本很低。要考虑的事情:

您不想用一只一只乌龟做这件事-您想要至少两只。否则,当您致电clear()时,您会丢失所有 (包括转盘),并且必须重画。您可以通过使用undo()来解决此问题,或者更简单地,让一只乌龟的图形永久化(刻度盘),而另一只乌龟的图形在每个刻度上清除(指针)。

下面的其他更改包括:抛弃time.sleep()以支持乌龟自己的ontimer()事件;从乌龟的基于功能的 API切换到面向对象的一个,这样我们就可以管理两只乌龟。然后我将乌龟切换为 Logo 模式,该模式将零度置于屏幕顶部,并使图形角度为顺时针而不是逆时针(如果您要实现时钟,这很有用!)

from turtle import Screen, Turtle, Vec2D
from time import localtime

CENTER = Vec2D(0, 0)

def draw_line(position, heading, length, color):
    hands.up()
    hands.goto(position)
    hands.down()
    hands.setheading(heading)
    hands.color(color)
    hands.forward(length)

def tick():
    time = localtime()

    second_heading = time.tm_sec * 6
    minute_heading = time.tm_min * 6 + second_heading / 60
    hour_heading = time.tm_hour % 12 * 30 + minute_heading / 12

    hands.clear()

    draw_line(CENTER, second_heading, 300, 'red')
    draw_line(CENTER, minute_heading, 200, 'blue')
    draw_line(CENTER, hour_heading, 100, 'green')

    screen.update()
    screen.ontimer(tick, 1000)

screen = Screen()
screen.mode("logo")  # 0 degrees at top, clockwise angles!
screen.tracer(False)  # force manual screen updates

# What this turtle draws is "permanent"
dial = Turtle(visible=False)
dial.penup()
dial.dot()
dial.setx(330)  # remember mode is "logo"
dial.pendown()
dial.circle(330)

# What this turtle draws has to be redrawn on every tick
hands = Turtle(visible=False)

tick()

screen.mainloop()

enter image description here