主要内容 #
- 综合应用:参照python -m turtledemo的clock模型,制作自己的时钟
4.时钟的动画设置 #
上两节课我们完成了时钟钟盘以及钟针的绘制,以及时钟的时间获取和展示,接下来只需要合理的设置钟针的动画效果,就能完成时钟的制作。 该示例代码无法单独完成运行,仅作为钟针动画设置讲解,示例2有运行示例while True: t=time.localtime()#通过无限循环不断获得目前时间 myturtle[0].setheading(t.tm_sec*6)#设置秒针旋转角度,每秒旋转6度 myturtle[1].setheading(t.tm_min*6)#设置分针针旋转角度,每分旋转6度 myturtle[2].setheading((t.tm_hour+t.tm_min/60)*30)#设置时针旋转角度,每小时旋转30度
5.时钟的完整制作 #
通过frame(radius),inithand(radius),mytime(radius)三个主要函数,以及mymove(x,y),myregisiter(name, length)两个辅助函数我们完成了钟盘的制作,表针的制作以及设置,时间的展示。再通过while True的无限循环完成了钟针的动画设置。 在这些函数定义和使用中,列表是我们使用的主要数据类型,循环和分支结构的使用,使我们的代码更加清晰明了。import turtle import time ######################## def mymove(x,y):#定义mymove函数,功能是让turtle画笔移动到指定位置 turtle.penup() turtle.goto(x,y) turtle.pendown() def frame(radius):#定义frame函数,该函数有一个参数表示钟盘的半径 turtle.mode('logo')#采用logo模式 num=[12]+[i for i in range(1,12)]#num列表,两个列表的链接表示钟盘的数字 turtle.pensize(7) for i in range(60):#实际钟盘有60个格子,我们使用60次循环完成绘制 turtle.penup();turtle.forward(radius);turtle.pendown()#每次循环开始我们先把画笔移动到钟盘半径处 if i % 5 == 0:#每绘制5个小格时到了整点数,我们做一个长度为20的标记 turtle.forward(20) if i//5<=4 or i//5>=8:#此层判断语句,是为了调整点数5,6,7的位置,可以尝试不加试一试效果 turtle.write('%d'%(num[i//5]),align='center',font=("Courier", 18, "bold")) else: turtle.penup();turtle.forward(25);turtle.pendown() turtle.write('%d'%(num[i//5]),align='center',font=("Courier", 18, "bold")) mymove(0,0) else: turtle.dot(5)#如果不是正点数,我们用一个直径为5的点表示 mymove(0,0)#每次做完标记回到时钟中心,这里的中心是(0,0) turtle.right(6)#每个小格代表360/60=6度,旋转6度完成下次循环中一个小格的绘制 def myregisiter(name, length):#name和length分别表示需要注册表针的名字和大小 mymove(0,0) turtle.penup()#形状注册时我们一般抬起画笔,只需注册相应形状即可 turtle.hideturtle()#隐藏画笔 turtle.forward(-length * 0.1) turtle.begin_poly()#开始记录多边形 turtle.forward(length * 1.1) turtle.end_poly()#结束记录多边形 p = turtle.get_poly()#得到多边形,完成注册 turtle.register_shape(name, p) def inithand(radius):#定义inithand(radius)函数,radius表示钟盘半径大小,返回值是已经初始化好的钟针列表 myturtle = [turtle.Turtle() for i in range(3)]#钟针画笔列表 myshape = ["secHand", "minHand", "hourHand"]#钟针画笔名字列表 for i in range(3): myregisiter(myshape[i], radius-10 - i * 20)#注册表针形状,长度秒针>分针>时针 myturtle[i].shape(myshape[i])#设置表针画笔的形状 myturtle[i].shapesize(1, 1, i*2)#设置表针粗细 myturtle[i].setheading(i*90)#初始化钟针的角度时间是6:15,结合钟表想一想为什么是6:15 return myturtle #返回钟针列表 def mytime(radius):#定义mytime(radius)函数,radius表示时钟半径 t = time.localtime()#获取当地时间 week = ["星期一", "星期二", "星期三","星期四", "星期五", "星期六", "星期日"] mymove(0,radius/3) turtle.write(week[t.tm_wday], align="center",font=("Courier", 14, "bold"))#写入周几 mymove(0,-radius/1.3) turtle.write('%d'%t.tm_year+' '+'%d'%t.tm_mon+' '+'%d'%t.tm_mday,\ align="center",font=("Courier", 14, "bold"))#写入年月日 ######################## turtle.tracer(False) radius=100 frame(radius)#调用表盘绘制函数 myturtle=inithand(radius)#调用表针初始化函数,并返回注册好的钟针列表 mytime(radius)#调用时间展示函数 turtle.tracer(True) #钟针动画设置 while True: t=time.localtime()#通过无限循环不断获得目前时间 myturtle[0].setheading(t.tm_sec*6)#设置秒针旋转角度,每秒旋转6度 myturtle[1].setheading(t.tm_min*6)#设置分针针旋转角度,每分旋转6度 myturtle[2].setheading((t.tm_hour+t.tm_min/60)*30)#设置时针旋转角度,每小时旋转30度 turtle.done()