钟表是一种计时的装置,也是计量和指示时间的精密仪器。钟表的样式千变万化,但是用来显示时间的表盘相差无几,大多数钟表表盘的样式由刻度(共60个,围成圆形)、指针(时针、分针和秒针)、周日期显示和日期显示组成。
图列:
实现时钟模拟:
使用python内置模块:
# 导入包
import turtle as tl
from datetime import *
1. 将画笔移动到指定的距离
def skip(step):
"""
将画笔移动到指定的距离
:param step:画笔移动的长度
:return:无返回值
"""
tl.penup() # 抬起画笔
tl.forward(step) # 移动画笔
tl.pendown() # 落下画笔
2. 绘制钟表刻度
def setip_clock(radius):
'''
建立钟表的外框
:param radius:
:return:
'''
tl.reset() # 重置turtle绘图环境到初始状态(清空画布)
tl.pensize(7) # 设置画笔线条的粗细
for i in range(60):
skip(radius) # 在距离圆形为r的位置落笔
if i %5==0: # 若能整除5,则画一条短直线
tl.forward(20) # 正方向画20像素
skip(-radius-20) # 反方向画20像素
else:
tl.dot(5) #绘制一个圆心点(直径为5)
skip(-radius)
tl.right(6)
3. 注册turtle形状,建立名字为name的形状
def make_hand(name,length):
'''
注册turtle形状,建立名字为name的形状
:param name:指针名称
:param length:指针长度
:return:
'''
tl.reset()
skip(-0.1*length)
# 开始记录多边形的顶点
tl.begin_poly()
tl.forward(1.1*length)
# 停止记录多边形的顶点,并与第一个顶点相连
tl.end_poly()
# 返回最后记录的多边形
handForm=tl.get_poly()
# 注册形状,命名为name
tl.register_shape(name,handForm)
4. 程序初始化设置,包括绘制三个表针,日期显示和周日
def init():
# 设置全局变量
global secHand,minHand,hurHand,printer
# 重置turtle指针向北
tl.mode("logo")
# 建立三个表针Turtle并初始化
secHand=tl.Turtle()
make_hand("secHand",125) # 秒针
secHand.shape("secHand")
minHand=tl.Turtle()
make_hand("minHand",130) #分针
minHand.shape("minHand")
hurHand=tl.Turtle()
make_hand("hurHand",90) # 时针
hurHand.shape("hurHand")
for hand in secHand,minHand,hurHand:
hand.shapesize(1,1,3) # 调整三根指针的粗细
hand.speed(0) # 设置移动速度
# 建立并输出文字的turtrl
printer=tl.Turtle()
printer.hideturtle()
printer.penup()
5. 以指定的格式返回周日日期
def week(d):
week=["星期一","星期二","星期三","星期四","星期五","星期六","星期日"]
return week[d.weekday()]
6. 以指定的格式返回日期
def day(d):
return "%s %d %d" %(d.year,d.month,d.day)
7. 实现钟表动态设置
def tick():
"""
绘制钟表的动态显示
:return:
"""
# 获取本地时间,使用类成员
d=datetime.today()
second=d.second+d.microsecond*0.000001
minute=d.minute+d.second/60.0
hour=d.hour+d.minute/60.0
# 将画笔的方向设置为to_angle参数
secHand.setheading(second*6)
minHand.setheading(minute*6)
hurHand.setheading(hour*30)
tl.tracer(False)
printer.fd(70) # 向前移动指定的距离
# 根据对齐(”左“,”中“,”右“)和给的那个字体,在当前龟位置写入文本
printer.write(week(d),align="center",font=("Courier",14,"bold"))
printer.back(130)
printer.write(day(d),align="center",font=("Courier",14,"bold"))
# 将位置和方向恢复到初始状态,位置初始坐标位(0,0)
# 方向初始位:”standard“ 模式为right向右即东,
# logo 模式是up向上即北
printer.home()
tl.tracer(True)
tl.ontimer(tick,100) # 计时器,100ms后继续调用tick
8. 主函数
def main():
# 关闭绘画追踪,可以用于加速绘画复杂图形
tl.tracer(False)
init()
# 画表框
setip_clock(200)
# 开启动画
tl.tracer(True)
tick()
# 启动时间循环,开始接收鼠标的和键盘的操作
tl.done()
# 测试
if __name__ == '__main__':
main()
图形化界面:
想了解模块的导入可看:python异常的捕捉与包
想了解turtle包可看:Python 常用内置库 time库、random库、turtle库
欢迎大家观看本期作品,希望本期作品可以帮助大家!
无论是学习还生活都是带着星星的(希望的星✨),大家一起加油吧!