#使用turtle 、math 和time模块共同实现系统时间的机械钟效果
from turtle import *
import math as m
import time
#t、t1、t2、t3分别代表四个海龟对象,其实一个也可以达到绘制效果,但是
#只使用一个海龟对象的话,undo()函数只能删除一步操作(或者说是撤销一
#步操作),之前绘制的图形(指针)不能删除。其效果就是删除旧指针,
#绘制新指针。
t=Turtle() #用于绘制钟面(表盘刻度)
t1=Turtle() #用于绘制时针
t2=Turtle() #用于绘制分针
t3=Turtle() #用于绘制秒针
#以下代码是绘制钟面
t.color("red")
t.penup()
t.goto(0,200)
t.pendown()
t.circle(-200)
t.penup()
for i in range(12): #该循环用于绘制钟表12个刻度(两点确定一条线段)
t.penup()
t.pensize(3)
t.goto(200*m.cos(3.14/2-3.14/6*i),200*m.sin(3.14/2-3.14/6*i))
t.pendown()
t.goto(180*m.cos(3.14/2-3.14/6*i),180*m.sin(3.14/2-3.14/6*i))
#t.pensize(20)
t.penup()
#以下两个t.goto()函数是定位输入时间刻度的位置
t.goto(170*m.cos(3.14/2-3.14/6*i),170*m.sin(3.14/2-3.14/6*i)-8)
t.pensize(1)
if i>0:#输入钟盘上的数字1-11
t.write(i)
if i+1==12: #输入钟盘上的数字12
t.goto(170*m.cos(3.14/2-3.14/6*(i+1)),170*m.sin(3.14/2-3.14/6*(i+1))-8)
t.write(12)
for j in range(1,5):#该层循环是绘制时刻之间的小刻度
t.penup()
t.goto(200*m.cos(3.14/2-3.14/6*i-3.14/30*j),200*m.sin(3.14/2-3.14/6*i-3.14/30*j))
t.pendown()
t.goto(185*m.cos(3.14/2-3.14/6*i-3.14/30*j),185*m.sin(3.14/2-3.14/6*i-3.14/30*j))
t.penup()
t.goto(0,-250)
t.pendown()
t.setheading(0)
t.circle(250)
t.penup()
t.home()
t.pendown()
t.hideturtle()
sj=time.strftime("%H:%M:%S") #以时分秒的格式获取系统时间
xs=sj[0:2] #以列表的方式截取小时数
fz=sj[3:5] #以列表的方式截取分钟数
mz=sj[6:8] #以列表的方式截取系统当前秒数
#以下三行绘制时针(t1对象绘制分针)
t1.pensize(8)
t1.hideturtle()
t1.goto(60*m.cos(3.14/2-3.14/6*int(xs)-int(fz)/60*3.14/6),60*m.sin(3.14/2-3.14/6*int(xs)-int(fz)/60*3.14/6))
#以下三行绘制分针(t2对象绘制分针)
t2.pensize(5)
t2.hideturtle()
t2.goto(100*m.cos(3.14/2-3.14/30*int(fz)),100*m.sin(3.14/2-3.14/30*int(fz)))
while int(mz)>=0:
sj=time.strftime("%H:%M:%S")
xs=sj[0:2]
fz=sj[3:5]
mz=sj[6:8]
t3.speed(0) #设置成0才有指针转动的效果
#绘制秒针
t3.goto(150*m.cos(3.14/2-3.14/30*int(mz)),150*m.sin(3.14/2-3.14/30*int(mz)))
time.sleep(1) #延迟1秒
t3.undo() #删除之前绘制的秒针
t3.hideturtle() #隐藏小海龟
#以下if语句达到条件(当前系统秒数为0)将删除之前的旧分针,重新绘制新时刻的分针
if int(mz)==0:
t2.undo() #删除旧分针
t2.home() #回到原地坐标(0,0)或者是钟面中心点
t2.speed(0) #设置成0才有指针转动的效果
#绘制新分针
t2.goto(100*m.cos(3.14/2-3.14/30*int(fz)),100*m.sin(3.14/2-3.14/30*int(fz)))
#以下if语句达到条件(当前系统分针数为0)将删除之前的旧时针,重新绘制新时刻的时针
if int(fz)==0:
t1.undo() #删除旧时针
t1.home()
t1.speed(0)
#绘制新时针
t1.goto(60*m.cos(3.14/2-3.14/6*int(xs)-int(fz)/60*3.14/6),60*m.sin(3.14/2-3.14/6*int(xs)-int(fz)/60*3.14/6))
效果图