今天来继续更新学习过程,完成了剩余的包含绘制表针,根据系统时间动态更新的功能
import turtle
from datetime import *
# 抬起画笔,向前运动一段距离放下
def Skip(step):
turtle.penup()
turtle.forward(step)
turtle.pendown()
# 绘制表盘
def SetupClock():
# 关闭绘图动画
turtle.tracer(False)
# 设置画笔属性
turtle.pencolor("brown")
turtle.pensize(7)
# 画60个点
for i in range(60):
# 将画笔移动到半径的位置
Skip(160)
# 判断是画线还是画点
if i % 5 == 0:
# 画线
turtle.forward(20)
# 编辑阿拉伯数字
number = int(i / 5)
number = 12 if number == 0 else number
# 5、6、7三个刻度需要向外移动
if (number == 5) or (number == 7):
# 将画笔外移20像素
Skip(20)
# 写阿拉伯数字
turtle.write(number, align="center", font=("Courier", 14, "bold"))
# 还原画笔位置
Skip(-20)
elif number == 6:
# 将画笔外移25像素
Skip(25)
# 写阿拉伯数字
turtle.write(number, align="center", font=("Courier", 14, "bold"))
# 还原画笔位置
Skip(-25)
else:
turtle.write(number, align="center", font=("Courier", 14, "bold"))
# 将画笔还原到画线的起始位置
Skip(-20)
else:
# 画点
turtle.dot(5)
# 将画笔再移动到原始位置
Skip(-160)
# 方向旋转6度
turtle.right(6)
# 开启绘图动画
turtle.tracer(True)
# 创建指针形状
def mkHand(name, length):
# 在创建形状之前,先清空窗口
turtle.reset()
# 确定指针尾部位置
Skip(-length * 0.1)
# 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
turtle.begin_poly()
# 绘制线段
turtle.forward(length * 1.1)
# 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
turtle.end_poly()
# 返回最后记录的多边形。
handForm = turtle.get_poly()
# 将handForm进行注册
turtle.register_shape(name, handForm)
# 初始化表针
def Init():
global secHand, minHand, hurHand, printer
turtle.tracer(False)
# 创建秒针、分针和时针三个指针形状
mkHand("secHand", 135)
mkHand("minHand", 125)
mkHand("hurHand", 90)
# 创建分别表示秒针、分针和时针的三个小乌龟
secHand = turtle.Turtle()
secHand.shape("secHand")
minHand = turtle.Turtle()
minHand.shape("minHand")
hurHand = turtle.Turtle()
hurHand.shape("hurHand")
# 设置形状大小,并关闭绘图动画
for hand in secHand, minHand, hurHand:
hand.shapesize(1, 1, 3)
hand.speed(0)
# 建立输出文字Turtle
printer = turtle.Turtle()
# 隐藏画笔的turtle形状
printer.hideturtle()
printer.penup()
turtle.tracer(True)
# 清空窗口,重新设置
turtle.reset()
def Week(t):
week = ["星期一", "星期二", "星期三",
"星期四", "星期五", "星期六", "星期日"]
return week[t.weekday()]
def Date(t):
y = t.year
m = t.month
d = t.day
return "%s-%d-%d" % (y, m, d)
# 调整表针方向
def Tick():
# 获取当前时间
t = datetime.today()
second = t.second + t.microsecond * 0.000001
minute = t.minute + second / 60.0
hour = t.hour + minute / 60.0
# 调整指针的方向
secHand.setheading(6 * second)
minHand.setheading(6 * minute)
hurHand.setheading(30 * hour)
# 修改表盘上的日期
turtle.tracer(False) # 关闭绘图动画
printer.forward(65)
printer.write(Week(t), align="center", font=("Courier", 14, "bold"))
printer.back(130)
printer.write(Date(t), align="center", font=("Courier", 14, "bold"))
printer.home() # 移动到原点
turtle.tracer(True) # 开启绘图动画
# 定时器
turtle.ontimer(Tick, 100)
if __name__ == "__main__":
# 设置乌龟模式为logo,即初始向上,正角度为顺时针
turtle.mode('logo')
# 初始化指针
Init()
# 调用绘制表盘函数
SetupClock()
# 调整表针方向
Tick()
# 等待用户操作,不自动关闭窗口
turtle.mainloop()