本系列旨在通过一系列由浅入深的python实战代码或项目,使普通人也能感受到编程的乐趣,编程能够在平时的工作生活上有所帮助。欢迎查看系列的开篇词和前面文章。
这是本系列的第五篇文章,使用python实现一个时钟。效果如下:
概述
使用python自带的turtle画图库绘制一个时钟钟面,并能够根据时间进行移动,显示当前星期、日期和时分秒。
程序整体上还是有点复杂的,搞清楚大概流程,然后自己上手运行一下看看效果。
程序实现流程是:
- 初始化时钟指针,设置长度和移动举例
- 绘制表盘上的刻度和对应的数字,显示星期和日期
- 根据时间进行指针的移动
代码实现
# coding=utf-8
import turtle
from datetime import *
# 定义一个函数,抬起画笔,向前运动一段距离放下
def Skip(step):
turtle.penup()
turtle.forward(step)
turtle.pendown()
# 该函数定义指针的移动
def mkHand(name, length):
# 注册Turtle形状,建立表针Turtle
turtle.reset()
Skip(-length * 0.1)
# 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
turtle.begin_poly()
turtle.forward(length * 1.1)
# 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
turtle.end_poly()
# 返回最后记录的多边形。
handForm = turtle.get_poly()
turtle.register_shape(name, handForm)
# 初始化时钟的指针
def Init():
global secHand, minHand, hurHand, printer
# 重置Turtle指向北
turtle.mode("logo")
# 建立三个表针Turtle并设置它们的长度
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()
# 设置表盘上的刻度和对应的数字
def SetupClock(radius):
# 建立表的外框
turtle.reset()
turtle.pensize(7)
for i in range(60):
Skip(radius)
if i % 5 == 0:
turtle.forward(20)
Skip(-radius - 20)
Skip(radius + 20)
if i == 0:
turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
elif i == 30:
Skip(25)
turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold"))
Skip(-25)
elif (i == 25 or i == 35):
Skip(20)
turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold"))
Skip(-20)
else:
turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold"))
Skip(-radius - 20)
else:
turtle.dot(5)
Skip(-radius)
turtle.right(6)
# 显示今天星期几
def Week(t):
week = ["星期一", "星期二", "星期三",
"星期四", "星期五", "星期六", "星期日"]
return week[t.weekday()]
# 显示今天的日期,格式是2022 7 2
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)
# 100ms后继续调用tick
turtle.ontimer(Tick, 100)
def main():
# 打开/关闭龟动画,并为更新图纸设置延迟。
turtle.tracer(False) # 关闭动画,不显示绘制表盘和指针的过程
Init() # 初始化时钟的指针
SetupClock(160) # 画出表盘,设置大小
turtle.tracer(True) # 打开动画
Tick() # 根据时间移动指针
turtle.mainloop()
# 程序运行入口,当模块被直接运行时,以下代码块将被运行,当模块其被其他导入时,代码块不被运行,可以后面引用其提供的方法
if __name__ == "__main__":
main()
今天分享的项目代码有点长,一些知识点进行的重点解读,收藏起来,方便有空的时候学习。
评论区