(程序开始阶段——上一篇博客:https://www.cnblogs.com/love528/p/9873526.html)
代码资源来自:
http://n.miaopai.com/media/K9Qlou7rdPc5TxpPaL1VDvwfv5hP~lHK (运行有错误,缺少date,week和结尾部分)
https://blog.csdn.net/yangxing2/article/details/78637472/
一、完整代码:
# coding=UTF-8 from turtle import * from datetime import * def Skip(step): #建立表的外框 penup() forward(step) pendown() def mkHand(name,length): #注册turtle形状,建立表针turtle reset() Skip(-length*0.1) begin_poly() forward(length*1.1) end_poly() handForm = get_poly() register_shape(name,handForm) def Init(): global secHand,minHand,hurHand,printer mode("logo") #重置turtle指向北 mkHand("secHand",125) #建立三个表针并初始化 mkHand("minHand",130) mkHand("hurHand",90) secHand = Turtle() secHand.shape("secHand") minHand = Turtle() minHand.shape("minHand") hurHand = Turtle() hurHand.shape("hurHand") for hand in secHand,minHand,hurHand: hand.shapesize(1,1,3) hand.speed(0) printer = Turtle() #建立输出文字turtle printer.hideturtle() printer.penup() def SetupClock(radius): #建立表外框 reset() pensize(7) for i in range(60): Skip(radius) if i % 5 == 0: forward(20) Skip(-radius-20) else: dot(5) Skip(-radius) right(6) def Week(t): week = ["Mon", "Tues", "Wed","Thur", "Fri", "Sat", "Sun"] 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) 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() tracer(True) ontimer(Tick,100) #100ms后继续调用tick def main(): tracer(False) Init() SetupClock(160) tracer(True) Tick() mainloop() if __name__ == "__main__": main()
二、运行结果截图
三、程序解读
1、思路
需求:5个Turtle对象, 1个绘制外表盘+1个输出文字++3个模拟表上针
Step1:建立5个Turtle对象并初始化 (表盘绘制和文本输出对象是turtle常见的对象方式;turtle的外观shape就是指针形状,在每一时刻以轴心为圆心旋转了一定角度)
Step2:静态表盘绘制
Step3:根据时钟更新表针位置与时间信息
基本库:Turtle、datetime
2、代码
(1)from turtle import *
Turtle库——Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟(画笔),在一个横轴为x、纵轴为y的坐标系(画布),根据一组函数指令的控制,在平面坐标系中移动,从而在它爬行的路径上绘制了图形。
操纵海龟绘图有3种命令:
运动命令
画笔控制命令
全局控制命令
还有其他命令
(2)from datetime import *
datetime模块重新封装了time模块,提供了更多处理日期和时间的接口。包含以下几个类和两个常量:
每个类中定义了很多属性和方法,包括对时间的调用及格式转换等问题在此不再赘述。
(3)几个重要的函数 (代码中的函数写成mode(),而不用写成turtle.mode(),是因为turtle是python的标准库,在python项目里不会提示“unresolved reference ‘xxx’”,但在解释器为python2.7的python文件中不会有提示。此提示不影响代码运行)
SetupClock(radius): 绘制表盘,表盘半径radius为参数
设置画笔大小,通过60次循环绘制刻度,每5个刻度为短线段,其余为小圆点。
Skip(step): 由于表盘刻度不连续,需频繁抬起画笔,放下画笔
mkHand(name,length): 定义指针几何形状。
使用两个函数begin_poly() 、end_poly()记录多边形形状,register_shape函数将handForm几何形状注册为合法的turtle外形.
Init(): 初始化表针和文本对象
Tick(): 绘制表针的动态显示
获取当前的时分秒,设置每个指针转动的角度,绘制星期与日期文本,每隔100ms调用此函数更新时间
tracer(False) : 实现绘制的效果同时出现,用tracer函数控制刷新,false时动画关闭,绘制结束后一致刷新;true时恢复动画的绘制效果
mainloop(): 启动事件循环 -调用Tkinter的mainloop函数。必须是乌龟图形程序中的最后一个语句。
the end.......