考点:角度旋转、海龟坐标轴以及简单时间绘图算法【Python习题10】
解析:
- 坐标轴的设置使用turtle的mode方法,主要一般使用"logo"以及默认的标准坐标。如下我的画图示意
以上图片画得不够好,请见谅,主要为了说明两个坐标轴的角度和默认方向。
2.角度旋转主要涉及到两个函数,一个是right函数,一个是setheading函数。这里必须要注意的是setheading函数的角度旋转默认是按照坐标系的方向来的,而right函数是按照实际前进方向的左右来的,right函数跟坐标系没有关系了,因为right已经决定了方向是向右的,类似的向左旋转就使用left函数了。
3.这里要注意的是写文字使用了write函数,这个函数在写的位置是当前点的位置的上方开始的,所以会导致数字位置错位,需要人工主动调整时钟的数字位置。
4.时钟要走起来,就要使用时钟来触发,这里我们直接使用turtle的ontimer事件去触发我们每次要刷新的三个指针,注意,这个函数的第一个参数在调用函数的时候,不要写括号;而第二个参数的单位是毫秒。
5.时钟的算法比较简单的,时分秒都使用系统的时间数值,从datetime库中去获取。计算时,因为一圈是360°,所以每一格就是360/60的度数,每次秒中指针的变化就直接按照这个度数乘以秒数即可。分钟指针也是类似于秒钟。不同的是小时指针,因为1小时的度数是360°/12,所以我们只要求出当前已经从0开始经历了多少小时即可知道应该转过的度数。而当前经历的小时数=实际的小时数+分钟所占的小时数,这里的分钟所占的小时数=实际分钟数/60即可。
运行效果如下图:
以上效果源代码:
""" import turtle #导入海龟库 import datetime #导入时间库 #画表盘函数 def drawPlanet(): #画圆 tp = turtle.Pen() tp.speed(0.1) # tp.dot(5) tp.penup() tp.forward(100) tp.setheading(-90) tp.pendown() # tp.dot(5) tp.circle(100) k=0 #画边线 for i in range(60): tp.penup() tp.home() tp.right(i*6) if i*6%5==0: tp.forward(80) else: tp.forward(90) tp.pendown() if i * 6 % 5 == 0: tp.forward(20) else: tp.forward(10) #数字 tp.penup() tp.home() tp.forward(65) # tp.pendown() tp.setheading(180) tp.setpos(tp.pos()[0] - 5, tp.pos()[1]-5) tp.write(12) for i in range(0,12): tp.penup() tp.home() # tp.pendown() tp.right(30 * i) tp.forward(65) if i!=0: tp.setpos(tp.pos()[0]-3,tp.pos()[1]-5) tp.write(i) #画指针函数 def drawPointer(): global hpt,mpt,spt,tnpt cthour=datetime.datetime.now().hour ctminite=datetime.datetime.now().minute ctsecond=datetime.datetime.now().second print(cthour,ctminite,ctsecond) spt.clear() spt.home() spt.dot(5) spt.setheading(360/60*ctsecond) spt.pendown() spt.forward(70) spt.penup() mpt.clear() mpt.home() mpt.setheading(360/60*ctminite) mpt.pendown() mpt.forward(55) mpt.penup() hpt.clear() hpt.home() cthour=cthour if cthour<12 else cthour-12 hpt.setheading(360/12*(cthour+ctminite/60)) hpt.pendown() hpt.forward(40) hpt.penup() tnpt.clear() tnpt.penup() tnpt.home() tnpt.setheading(0) tnpt.forward(110) tnpt.setheading(90) tnpt.write("北京时间:") tnpt.forward(60) tnpt.pendown() tnpt.write(datetime.datetime.now().strftime("%Y{}%m{}%d{} %H:%M:%S").format("年","月","日")) turtle.ontimer(drawPointer,100) turtle.title("刘金玉编程,模拟时钟") #要记得老刘哦! turtle.mode("logo") #坐标轴模式的设置 turtle.tracer(False) #取消逐步绘制,让其一步到位 drawPlanet() hpt = turtle.Pen() # 时钟 mpt = turtle.Pen() # 分钟 spt = turtle.Pen() # 秒钟 tnpt=turtle.Pen()#现在时间 drawPointer() turtle.penup() turtle.home() turtle.color("blue") turtle.write("刘金玉编程") turtle.hideturtle() turtle.done()
总结:
本节时钟绘制应该是很重要的知识要点,通过此题的训练,可以达到灵活使用海龟画图的中基本用法,灵活使用坐标轴、定时器,可以为未来绘制动态图形提供逻辑基础。