打开网易新闻 查看精彩图片

考点:角度旋转、海龟坐标轴以及简单时间绘图算法【Python习题10】

解析:

  1. 坐标轴的设置使用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即可。

运行效果如下图:

打开网易新闻 查看精彩图片

以上效果源代码:

# -*- coding: utf-8 -*-"""@File文件 : ljytest83@Time创建时间 : 2021/12/15@Author作者 : 刘金玉@Contact联系方式 : selidev@qq.com 编程创造城市 http://bcczcs.com注:作者信息请保留!否则必究法律责任!刘金玉编程,编程创造城市!作者微信号:selidev作者抖音号:selidev作者B站:刘金玉编程微信公众号:编程创造城市"""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,tnptcthour=datetime.datetime.now().hourctminite=datetime.datetime.now().minutectsecond=datetime.datetime.now().secondprint(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-12hpt.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()

总结:

本节时钟绘制应该是很重要的知识要点,通过此题的训练,可以达到灵活使用海龟画图的中基本用法,灵活使用坐标轴、定时器,可以为未来绘制动态图形提供逻辑基础。

更多Python基础操作知识,大家可以到B站/优酷/爱奇艺/好看视频/腾讯视频搜索“刘金玉”,可以找到《零基础Python教程》和《Python高级进阶教程》视频合集哦!全部免费亲情奉献!

联系作者:刘金玉

长按关注公众号

编程创造城市官网:https://bcczcs.com/