钟表是一种计时的装置,也是计量和指示时间的精密仪器。钟表的样式千变万化,但是用来显示时间的表盘相差无几,大多数钟表表盘的样式由刻度(共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()# 注册形状,命名为nametl.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) # 设置移动速度# 建立并输出文字的turtrlprinter=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.000001minute=d.minute+d.second/60.0hour=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库
欢迎大家观看本期作品,希望本期作品可以帮助大家!
无论是学习还生活都是带着星星的(希望的星✨),大家一起加油吧!