python绘图代码的解读
对以下python绘制钟表没有解读的代码逐行进行解读
```python
import turtle as tt
from datetime import *
# 抬起画笔,跳到一个地方
def Skip(step):
tt.penup()#抬起画笔
tt.forward(step)#画笔前进一段距离
tt.pendown()#画笔落下
#创建表针函数
def Zheng(name, length):
tt.reset()# 注册Turtle形状,建立表针Turtle
Skip(-length * 0.1)#表针一端,过表盘中心一小段,开始绘制
tt.begin_poly()# 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
tt.forward(length * 1.1)# 设置表针长度,绘制表针
tt.end_poly() # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连
handForm = tt.get_poly()# 返回最后记录的多边形。
tt.register_shape(name, handForm)
def Init():
global miao, fen, shi, printer
tt.mode("logo")# logo:向上(北) 顺时针
# 建立三个表针Turtle并初始化
Zheng("miao", 135)#设置秒针的长度为135
Zheng("fen", 120)#分针的长度为120
Zheng("shi", 80)#时针的长度为80
miao = tt.Turtle()
miao.shape("miao")
fen = tt.Turtle()
fen.shape("fen")
shi = tt.Turtle()
shi.shape("shi")
for hand in miao, fen, shi:
hand.shapesize(1, 1, 3)
hand.speed(0)
# 建立输出文字Turtle
printer = tt.Turtle()
# 隐藏画笔
printer.hideturtle()
printer.penup()
def SetupClock(r):
# 建立表的外框
tt.reset()
tt.pensize(7)#画笔宽度
for i in range(60):#循环60次
Skip(r)
if i % 5 == 0:
tt.forward(20)
Skip(-r - 20)
Skip(r + 20)
if i == 0:
tt.write(int(12), align="center", font=("Courier", 15, "bold"))
elif i == 30:
Skip(25)
tt.write(int(i/5), align="center", font=("Courier", 15, "bold"))
Skip(-25)
elif (i == 25 or i == 35):
Skip(20)
tt.write(int(i/5), align="center", font=("Courier", 15, "bold"))
Skip(-20)
else:
tt.write(int(i/5), align="center", font=("Courier", 15, "bold"))
Skip(-r - 20)
else:
tt.dot(5)
Skip(-r)
tt.right(6)
#创建星期函数
def Week(t):
week = ["Monday", "Tuesday", "Wed","Thurs", "Fri", "Sat", "Sun"]#创建星期列表
return week[t.weekday()]# t.weekday() 周一为0,周二为1...可作为列表的index
#创建日期函数
def Date(t):
y = t.year#获得年
m = t.month#获得月
d = t.day#获得日
return "{} 年 {} 月 {} 日".format(y, m, d)#格式化字符串:-年-月-日
#显示时间函数
def time(t):
m = t.minute#获得分
h = t.hour#获得时
return "{}:{}".format(h, m)#格式化字符串
def Tick():
# 绘制表针的动态显示
t = datetime.today()
second = t.second + t.microsecond * 0.000001
minute = t.minute + second / 60.0
hour = t.hour + minute / 60.0
miao.setheading(6 * second)
fen.setheading(6 * minute)
shi.setheading(30 * hour)
tt.tracer(False)
printer.forward(65)
printer.write(Week(t), align="center",
font=("Courier", 15, "bold"))
printer.back(130)
printer.write(Date(t), align="center",
font=("Courier", 15, "bold"))
printer.home()
tt.tracer(True)
# 100ms后继续调用tick
tt.ontimer(Tick, 100)
def main():
# 打开/关闭龟动画,并为更新图纸设置延迟。
tt.tracer(False)
Init()
SetupClock(160)
tt.tracer(True)
Tick()
tt.mainloop()#显示时钟
#主窗口运行
if __name__ == "__main__":
main()
```
首先,导入了turtle和datetime两个库。turtle是python自带的绘图库,datetime是python自带的日期和时间处理库。
接下来是定义函数Skip(step),这个函数的作用是抬起画笔,然后向前移动step的距离。
接下来是定义函数Zheng(name, length),这个函数的作用是创建一个名为name的表针,长度为length。首先使用tt.reset()重置turtle,然后使用Skip()函数跳到一个地方(过表盘中心一小段),然后使用tt.begin_poly()开始记录多边形的顶点,tt.forward(length * 1.1)绘制表针,tt.end_poly()停止记录多边形的顶点,然后使用tt.get_poly()返回最后记录的多边形,并使用tt.register_shape()注册该多边形。
接下来是定义函数Init(),这个函数的作用是初始化绘制时钟所需的turtle。首先使用tt.mode()设置turtle的模式,然后使用Zheng()函数创建三个表针turtle,分别是秒针、分针和时针。接着使用for循环遍历每个表针turtle,并设置它们的形状大小和速度。最后创建输出文字turtle,并隐藏画笔。
接下来是定义函数SetupClock(r),这个函数的作用是绘制时钟表盘。首先使用tt.reset()重置turtle,然后使用tt.pensize()设置画笔的宽度。接着使用for循环遍历每个刻度,使用Skip()函数跳到绘制刻度的位置,使用tt.forward()绘制刻度,然后再使用Skip()函数跳回到起点。如果是整点刻度,则再使用tt.write()函数输出整点数字。
最后是主函数,使用Init()函数初始化,然后使用SetupClock()函数绘制表盘。接着使用while True:循环不断更新时钟,获取当前的时、分、秒,然后计算出每个表针的角度,使用turtle的setheading()函数设置表针的角度,最后使用time.sleep()函数设置延迟1秒。
望采纳。